蜂巢:两点之间的距离
Hive: Distance Between two points
我需要编写配置单元查询,该查询将从 table 中提取,包括纬度列和 return 结果,这些结果在给定点的 x 英里以内。 Hive 需要工具包或插件吗?
我在 HDInsight
上使用 Hadoop (3.2.7.844) 运行
抱歉,如果我理解你的用例正确的话,你也可以在查询中写一个大的数学函数。
在查询中编写数学函数会让人头疼,但从配置单元查询的角度来看,它应该是可行的。
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2( sqrt(a), sqrt(1-a) )
d = R * c (where R is the radius of the Earth).
以及基于您的 x 英里的条件过滤器。
采用以下路径显然更易于管理和清洁。
是的,您需要的不仅仅是 Hive 开箱即用的功能。
您基本上可以选择两条路径。
- 编写您自己的 UDF(非常简单)。这可能是一个标量 UDF,它将以 x 英里和您的问题点作为参数,returns table(lat,long)的行作为您的参数点以 x 英里为单位。在 UDF 中,您可以实现一个函数来计算提供给 UDF 的 table 的参数点和行之间的距离。 Return 如果距离小于 x 英里。
- 或者您可以使用其他人已经写好的UDF/UDTFs。 Hive 的开源在这方面受益匪浅。你可以使用这个库 ESRI 库来做你的事情 https://github.com/Esri/gis-tools-for-hadoop。还有很多其他此类库可用。
Apache Hivemall supports Haversine distance 给定两个地理位置之间的计算。
-- Tokyo (lat: 35.6833, lon: 139.7667)
-- Osaka (lat: 34.6603, lon: 135.5232)
select
haversine_distance(35.6833, 139.7667, 34.6603, 135.5232) as km,
haversine_distance(35.6833, 139.7667, 34.6603, 135.5232, true) as mile;
我需要编写配置单元查询,该查询将从 table 中提取,包括纬度列和 return 结果,这些结果在给定点的 x 英里以内。 Hive 需要工具包或插件吗?
我在 HDInsight
上使用 Hadoop (3.2.7.844) 运行抱歉,如果我理解你的用例正确的话,你也可以在查询中写一个大的数学函数。 在查询中编写数学函数会让人头疼,但从配置单元查询的角度来看,它应该是可行的。
dlon = lon2 - lon1
dlat = lat2 - lat1
a = (sin(dlat/2))^2 + cos(lat1) * cos(lat2) * (sin(dlon/2))^2
c = 2 * atan2( sqrt(a), sqrt(1-a) )
d = R * c (where R is the radius of the Earth).
以及基于您的 x 英里的条件过滤器。 采用以下路径显然更易于管理和清洁。
是的,您需要的不仅仅是 Hive 开箱即用的功能。
您基本上可以选择两条路径。
- 编写您自己的 UDF(非常简单)。这可能是一个标量 UDF,它将以 x 英里和您的问题点作为参数,returns table(lat,long)的行作为您的参数点以 x 英里为单位。在 UDF 中,您可以实现一个函数来计算提供给 UDF 的 table 的参数点和行之间的距离。 Return 如果距离小于 x 英里。
- 或者您可以使用其他人已经写好的UDF/UDTFs。 Hive 的开源在这方面受益匪浅。你可以使用这个库 ESRI 库来做你的事情 https://github.com/Esri/gis-tools-for-hadoop。还有很多其他此类库可用。
Apache Hivemall supports Haversine distance 给定两个地理位置之间的计算。
-- Tokyo (lat: 35.6833, lon: 139.7667)
-- Osaka (lat: 34.6603, lon: 135.5232)
select
haversine_distance(35.6833, 139.7667, 34.6603, 135.5232) as km,
haversine_distance(35.6833, 139.7667, 34.6603, 135.5232, true) as mile;