PIG:计算纬度和经度对之间的最大距离
PIG: Compute max distance between pairs of latitudes and longitudes
我有一个 pig 包,它已经按键分组,其值是纬度和经度。我想计算每个键的任意两个(lat,long)对之间的最大距离;如果少于两个,则输出应为 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 udf 的简便方法来执行此操作?谢谢您的帮助。
检查我的 github 回购:
https://github.com/csabakecskemeti/geo_clustering/tree/master/src/main/java/kecso/geotools/geodistance
这是一个用于地理距离计算的 java UDF。您可以使用它来计算 pairn 上的距离,而不是应用 MAX 函数。希望对您有所帮助。
以下是我想到的步骤:
把袋子压平。这将生成具有
的元组(在您的示例中)
(1,1.1,1.1)
(1,2.1,2.1)
(1,3.1,3.1)
(2,1.1,1.1)
执行上述步骤两次,为生成的关系赋予两个不同的名称:r1 和 r2。
JOIN r1 和 r2,按关键字字段。这将为每个键创建一个笛卡尔积
按键加入r1,按键加入r2
这将导致
(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 的 HaversineDistInMiles UDF
http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/geo/HaversineDistInMiles.html
计算每对坐标之间的距离。对于坐标相同的对,你会得到 distance == 0.
(datafu 是来自 LinkedIn 的实用 UDF 的一个很棒的包。在这里阅读它:https://datafu.incubator.apache.org)
- 按键分组,并为每个键生成 MAX(distance)。这将为您提供以英里为单位的最大距离。乘以 1.6093 得到以公里为单位的距离。
假设您的文件如下所示:
1 {(1.1,1.1),(2.1,2.1),(3.1,3.1)}
2 {(1.1,1.1)}
使用这个 pig 脚本:
register '/path/to/datafu-1.2.0.jar';
a = LOAD 'pigcoords.tsv' using PigStorage() as (A1:int, B1:bag{T:tuple(longitude:double, latitude:double)});
b = foreach a generate A1, FLATTEN(B1);
c = foreach a generate A1, FLATTEN(B1);
d = foreach (join b by A1, c by A1) generate [=12=]..;
op = FOREACH d GENERATE b::A1 as key, datafu.pig.geo.HaversineDistInMiles(b::B1::latitude, b::B1::longitude, c::B1::latitude, c::B1::longitude) as distance;
res = FOREACH (group op by key) generate MAX(op.distance)*1.6093;
dump res;
我有一个 pig 包,它已经按键分组,其值是纬度和经度。我想计算每个键的任意两个(lat,long)对之间的最大距离;如果少于两个,则输出应为 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 udf 的简便方法来执行此操作?谢谢您的帮助。
检查我的 github 回购: https://github.com/csabakecskemeti/geo_clustering/tree/master/src/main/java/kecso/geotools/geodistance
这是一个用于地理距离计算的 java UDF。您可以使用它来计算 pairn 上的距离,而不是应用 MAX 函数。希望对您有所帮助。
以下是我想到的步骤:
把袋子压平。这将生成具有
的元组(在您的示例中)(1,1.1,1.1) (1,2.1,2.1) (1,3.1,3.1) (2,1.1,1.1)
执行上述步骤两次,为生成的关系赋予两个不同的名称:r1 和 r2。
JOIN r1 和 r2,按关键字字段。这将为每个键创建一个笛卡尔积
按键加入r1,按键加入r2
这将导致
(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 的 HaversineDistInMiles UDF http://datafu.incubator.apache.org/docs/datafu/1.2.0/datafu/pig/geo/HaversineDistInMiles.html
计算每对坐标之间的距离。对于坐标相同的对,你会得到 distance == 0.
(datafu 是来自 LinkedIn 的实用 UDF 的一个很棒的包。在这里阅读它:https://datafu.incubator.apache.org)
- 按键分组,并为每个键生成 MAX(distance)。这将为您提供以英里为单位的最大距离。乘以 1.6093 得到以公里为单位的距离。
假设您的文件如下所示:
1 {(1.1,1.1),(2.1,2.1),(3.1,3.1)}
2 {(1.1,1.1)}
使用这个 pig 脚本:
register '/path/to/datafu-1.2.0.jar';
a = LOAD 'pigcoords.tsv' using PigStorage() as (A1:int, B1:bag{T:tuple(longitude:double, latitude:double)});
b = foreach a generate A1, FLATTEN(B1);
c = foreach a generate A1, FLATTEN(B1);
d = foreach (join b by A1, c by A1) generate [=12=]..;
op = FOREACH d GENERATE b::A1 as key, datafu.pig.geo.HaversineDistInMiles(b::B1::latitude, b::B1::longitude, c::B1::latitude, c::B1::longitude) as distance;
res = FOREACH (group op by key) generate MAX(op.distance)*1.6093;
dump res;