我在pig中有一个包,它按键分组,值是纬度和经度。我想计算任意两个(lat,long)对之间的最大距离;如果少于2,则输出应为0。
例如,如果我的包
{(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自定义项来做到这一点?谢谢你的帮助。
2条答案
按热度按时间nimxete21#
以下是我想到的步骤:
把袋子弄平。这将使用
(1,1.1,1.1) (1,2.1,2.1) (1,3.1,3.1) (2,1.1,1.1)
执行上述步骤两次,为结果关系指定两个不同的名称:r1和r2。
通过键域加入r1和r2。这将为每个键创建笛卡尔积
按键联接r1,按键联接r2
这将导致
此列表包含每个键的所有可能对。作为奖励,对于只有一个坐标的键,您还可以获得一对该坐标。
使用来自datafu的haversinedistinmiles自定义项http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/geo/haversinedistinmiles.html
计算每对坐标之间的距离。对于具有相同坐标的对,您将得到距离==0。
(datafu是linkedin提供的一个很好的实用自定义项包。请在此处阅读:https://datafu.incubator.apache.org)
按键分组,并为每个键生成最大(距离)。这将提供以英里为单位的最大距离。乘以1.6093得到以公里为单位的距离。
假设您的文件如下所示:
使用以下脚本:
falq053o2#
检查我的github回购:https://github.com/csabakecskemeti/geo_clustering/tree/master/src/main/java/kecso/geotools/geodistance
这是一个用于地理距离计算的javaudf。你可以用它来计算两半之间的距离,而不是用max函数。我希望这有帮助。