蜂巢:两点之间的距离

时间:2016-03-04 20:54:27

标签: azure hadoop hive hiveql hdinsight

我需要编写一个hive查询,该查询将从包含lat lon列的表中提取并返回给定点x英里范围内的结果。 Hive是否需要一个工具包或插件?

我正在使用在HDInsight上运行的Hadoop(3.2.7.844)

2 个答案:

答案 0 :(得分:1)

抱歉,如果我理解你正确使用案例,你也可以在查询中写一个很大的数学函数。 在查询中编写数学函数将是一个令人头痛的问题,但从hive查询的角度来看它应该是可行的。

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提供的功能。

您可以采取两种方式。

  1. 编写自己的UDF(非常简单)。这可能是一个标量UDF,它将x英里和您的问题作为参数并返回表(lat,long)的行,这些行的参数点为x英里。在UDF中,您可以实现一个函数来计算提供给UDF的表的参数点和行之间的距离。如果距离小于x英里则返回。
  2. 或者您可以使用已经由其他人编写的此类UDF / UDTF。 Hive是开源的,因此受益匪浅。您可以使用此库ESRI库来完成您的工作https://github.com/Esri/gis-tools-for-hadoop。还有很多其他类似的库。

答案 1 :(得分:0)

Apache Hivemall支持给定两个地理位置之间的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;