2017-10-07 6 views
0

のシリーズからハイブの累積距離を計算する:このような表がある緯度、経度ポイント

latitude longitude 

我々は走行距離

latitude longitude odometer 
を格納します。この表には3番目の列を追加したいです

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) 

がどのように行うことができます?次のように走行距離計i番目の行が計算される

答えて

0

この問題を解決するための鍵は、hive-lagとsumのウィンドウ関数を使用することです。

ステップ1:最初のステップは、長い、長い現在の緯度に加え、前LATを列挙することです。これは、LAG関数を使用して行われ、この問題を解決するための鍵である:時間的順序で、我々は緯度注文するtimestamp列の存在を仮定し

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

、long型は。

ステップ2:次に、我々は半正矢式の一次近似を用い(lat1, lon1)(lat2, lon2)間の距離を計算する:

select *, 
        6378137.0 * sqrt(pow(lat1 - lat2, 2) + cos(lat1) * cos(lat2) * pow(lon1 - lon2, 2)) as distance 
       from step2 
次のステップは、ラジアンに

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

ステップ3度を変換することです

ステップ4:最終的に、distance列の実行合計を計算します。

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