2016-01-08 135 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)} 
    

    使用这种猪脚本:

    ​​
    相关问题