2016-01-08 172 views
0

我在豬身上有一個袋子,按鍵分組,其值爲經度和緯度。我想計算每個鍵的任意兩個(經度,長度)對之間的最大距離;如果少於兩人隨後,輸出應爲0。PIG:計算緯度和經度對之間的最大距離

例如,如果我的包是

{(1): (1.1, 1.1), 
(1): (2.1, 2.1), 
(1): (3.1, 3.1), 
(2): (1.1, 1.1) 
} 

我的答案是

{(1): 314 (km) 
(2): 0 
} 

來計算兩者之間的距離公式(拉特,長)對是:

(((lat1 - lat2) * pi() * 3959/180)^2 + ((long1 - long2) * 2 * pi() * 3959 * cos(((lat2 + lat1)/2) * .0174533)/360)^2)^(1/2) 

是否有一種簡單的方法來創建一個python udf來做到這一點?謝謝您的幫助。

回答

1

下面是我想的步驟:

  1. FLATTEN袋。這將產生與

    (1,1.1,1.1) (1,2.1,2.1) (1,3.1,3.1) (2,1.1,1.1)元組(在你的例子)

  2. 執行TWICE上面的步驟,給出兩個不同的名稱:r1和r2。

  3. 通過關鍵字段加入r1和r2。這將創建一個笛卡爾乘積通過鍵,R2每個鍵

JOIN R1的關鍵

這將導致

(1,1.1,1.1,1,1.1,1.1) 
(1,1.1,1.1,1,2.1,2.1) 
(1,1.1,1.1,1,3.1,3.1) 
(1,2.1,2.1,1,1.1,1.1) 
(1,2.1,2.1,1,2.1,2.1) 
(1,2.1,2.1,1,3.1,3.1) 
(1,3.1,3.1,1,1.1,1.1) 
(1,3.1,3.1,1,2.1,2.1) 
(1,3.1,3.1,1,3.1,3.1) 
(2,1.1,1.1,2,1.1,1.1) 

這個列表包含了每個按鍵可能對。作爲獎勵,對於只有一個座標的鍵,您還可以獲得一對與其自身的座標。

從datafu http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/geo/HaversineDistInMiles.html

  • 使用HaversineDistInMiles UDF來計算每對座標之間的距離。爲了對它們是同一個座標,你會得到距離== 0,

    (datafu是LinkedIn實用的UDF的大包閱讀在這裏:https://datafu.incubator.apache.org

  • 按鍵分組,併爲每個鍵生成MAX(距離)。這將以英里爲單位給你最大的距離。乘以1.6093得到KM中的距離。
  • 假設你的文件是這樣的:

    1 {(1.1,1.1),(2.1,2.1),(3.1,3.1)} 
    2 {(1.1,1.1)} 
    

    使用這種豬腳本:

    ​​
    相關問題