2017-10-07 68 views
0

的給定一個表像這樣的蜂巢累積距離:計算由一系列緯度,經度點

latitude longitude 

我們希望將第三列添加到該表,該表將存儲的行駛距離

latitude longitude odometer 

其中用於第i行的里程錶計算如下:

odometer_i = odometer_{i-1} + distance(lat_i, lon_i, lat_{i-1}, lon_{i-1}) 

distance(x1, y1, x2, y2) = sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)) 

odometer_0 = 0 (first row) 

如何才能做到這一點?

回答

0

解決這個問題的關鍵是使用hive - lag和sum的窗口函數。

第1步:第一步是枚舉以前的經緯度,除了當前的緯度經度,long。這是使用滯後函數完成,關鍵是解決這個問題:

SELECT *, 
        lag(latitude, 1) over (order by timestamp) as previous_latitude, 
        lag(longitude, 1) over (order by timestamp) as previous_longitude 
        from table 

,我們假定一個timestamp柱的存在性緯度訂購,多頭在時間順序。

步驟2:下一步驟是度轉換成弧度

   select *, 
       radians(previous_latitude) as lat1, 
       radians(previous_longitude) as lon1, 
       radians(latitude) as lat2, 
       radians(longitude) as lon2 
       from step1 

步驟3:接下來,我們計算使用haversine公式的第一階近似(lat1, lon1)(lat2, lon2)之間的距離:

select *, 
        6378137.0 * sqrt(pow(lat1 - lat2, 2) + cos(lat1) * cos(lat2) * pow(lon1 - lon2, 2)) as distance 
       from step2 

第4步:最後我們計算distance列的運行總和:

select *, sum(distance) over (order by timestamp) as odometer from step3