Pilosa文件翻譯(三)示例
目錄
傳輸Transportation
簡單說明 Introduction
紐約市釋出了一個非常詳細的包含了超過10億條計程車相關資料的集合。該資料已經成為科技部落格分析的熱門目標,並且已經得到了很好的研究。出於這個原因,我們認為將這些資料匯入Pilosa
,以便確定同一資料集情況下與其他資料儲存和技術進行比較。
一般來說,傳輸(Transportation)是Pilosa的值得關注的用例,因為它通常涉及多個不同的資料來源,以及高速率,實時和極大量的資料(特別是如果想得出合理的結論)。
我們編寫了一個工具來幫助將NYC(紐約市)計程車資料匯入Pilosa
這個工具是PDK
(Pilosa開發工具包)的一部分,並利用了許多可重複使用的模組,這些模組也可以幫助您匯入其他資料。 接下來,我們將逐步解釋整個過程。
初始設定之後,PDK匯入工具會執行我們定義Pilosa架構
所需的一切,相應地將資料對映到點陣圖
,然後將其匯入Pilosa
。
資料模型 Data Model
紐約出租車資料由以下列出的許多csv
檔案組成:http://www.nyc.gov/html/tlc/html/about/trip_record_data.shtml。 這些資料檔案大約有20列,其中大約一半與我們正在研究的基準查詢相關:
- 距離(Distance): miles(英里), floating point(浮點值)
- 車費(Fare): dollars(美元), floating point(浮點值)
- 乘客人數(Number of passengers): integer(整數值)
- 下車位置(Dropoff location): latitude and longitude(經緯度), floating point(浮點值)
- 上車位置(Pickup location): latitude and longitude(經緯度), floating point(浮點值)
- 下車時間(Dropoff time): timestamp(時間戳)
- 上車時間(Pickup time): timestamp(時間戳)
注意:下面表格中的row ID就是指記錄的值,不要理解成MySQL等資料庫的rowID。
我們匯入這些欄位,從每個欄位建立一個或多個Pilosa欄位:
欄位(Field) | 對映(Mapping) |
---|---|
cab_type(計程車型別) | 直接對映整數列舉值 → row ID |
dist_miles(距離) | 四捨五入round(dist) → row ID |
total_amount_dollars(總金額) | 四捨五入round(dist) → row ID |
passenger_count(乘車人數) | 直接對映整數值 → row ID |
drop_grid_id(下車位置網格ID) | (lat, lon) → 100x100矩形分割網格 → cell(格子) ID |
drop_year | 年份year(timestamp) → row ID |
drop_month | 月份month(timestamp) → row ID |
drop_day | 該月第幾天day(timestamp) → row ID |
drop_time(下車時間) | 該天中的時間對映到48個半小時組成的桶中 |
pickup_grid_id(下車位置網格ID) | (lat, lon) → 100x100矩形分割網格 → cell ID |
pickup_year | year(timestamp) → row ID |
pickup_month | month(timestamp) → row ID |
pickup_day | day(timestamp) → row ID |
pickup_time(上車時間) | time of day mapped to one of 48 half-hour buckets → row ID |
我們還建立了兩個附加欄位表示持續時間和每一次乘坐的平均速度:
欄位(Field) | 對映(Mapping) |
---|---|
duration_minutes(持續時間) | round(drop_timestamp - pickup_timestamp) → row ID |
speed_mph() | round(dist_miles ÷ (drop_timestamp - pickup_timestamp)) → row ID |
對映Mapping
我們要使用的每個列(column)
都必須根據某些規則對映到欄位(fields)
和row ID
的組合。 有很多方法可以實現這個對映,計程車資料集為我們提供了一個可能性的很好的描述。
0列(colums) --> 1欄位(field)
cab_type
: 每一行表示一個計程車的型別,在一行資料中有一些bit位來表示一次乘車中使用的計程車型別。 這是一個簡單的列舉對映,例如黃色yellow=0
,綠色green=1
等。這個欄位值的位寬(bits)由資料來源確定。也就是說,我們有幾個資料來源(NYC計程車-黃色, NYC計程車-綠色,Uber汽車),對於每一個數據來源,要設定不同的cab_type
常量值。
1列(colums) --> 1欄位(field)
以下三個欄位以簡單的直接方式從原始資料的單個列進行對映。
dist_miles
:每一行值(row ID)表示乘車的距離,這個對映關係很簡單:例如行值1
(row 1)表示乘車距離在[0.5,1.5]
這個區間內。也就是說,我們將距離這個浮點值舍入為整數並將其直接用作row ID
。通常,從浮點值到row ID
的對映可以是任意的。
舍入對映實現簡潔,簡化了匯入和分析。並且,它是人類可讀的。 我們會看到這種模式多次使用。
在PDK
使用中,我們定義了一個Mapper
,它是一個只返回整數row ID
的函式。 PDK
具有許多預定義的對映器,可以使用一些引數進行描述。 其中之一是LinearFloatMapper
。在下面程式碼中它將線性函式應用於輸入,並將其轉換為整數,因此隱式處理舍入。
lfm := pdk.LinearFloatMapper{
Min: -0.5,
Max: 3600.5,
Res: 3601,
}
Min
和Max
定義線性函式,Res
確定輸出row ID
的最大允許值。我們選擇這些值以產生一個舍入到最接近的整數
的行為。其他預定義的對映器也有自己的特定引數,通常是兩個或三個。