1. 程式人生 > >Pilosa文件翻譯(三)示例

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,
}

MinMax定義線性函式,Res確定輸出row ID的最大允許值。我們選擇這些值以產生一個舍入到最接近的整數的行為。其他預定義的對映器也有自己的特定引數,通常是兩個或三個。