从一系列lat,lon点计算配置单元中的累积距离

时间:2017-10-07 21:40:59

标签: hive

给出一个这样的表:

latitude longitude

我们想在此表中添加第3列,用于存储运行距离

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)

怎么办呢?

1 个答案:

答案 0 :(得分:0)

解决这个问题的关键是使用hive-lag和sum的窗口函数。

步骤1:第一步是枚举前一个lat,除了当前的lat,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列来排序lat,按时间顺序排长。

步骤2:下一步是将度数转换为弧度

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

第3步:接下来,我们使用半正式公式的一阶近似计算(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