2016-03-04 7 views
1

Мне нужно написать запрос на улей, который вытащит из таблицы, включая столбцы для lat lon, и результаты возврата, которые находятся в пределах x миль заданной точки. Для улья требуется набор инструментов или плагин для этого?Улей: Расстояние между двумя точками

Я использую Hadoop (3.2.7.844) работает на HDInsight

+0

Похожий вопрос на GIS.SE - http://gis.stackexchange.com/questions/185494/proximity-query-in-hive-using-esri-geospatial-library –

ответ

1

К сожалению, Вы также можете просто написать большую математическую функцию в запросе, если я понимаю, что вы используете дело правильно. Написание математической функции в запросе будет головной болью, но с точки зрения куста, она должна быть выполнимой.

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, уже написанные другими людьми. Это был открытый источник, который выиграл от этого. Вы можете взять библиотеку ESRI библиотеки, чтобы делать ваши вещи https://github.com/Esri/gis-tools-for-hadoop. Есть также множество других подобных библиотек.
+0

Спасибо. Похоже, мне нужно научиться обновлять HDInsight для любого из этих двух путей. Я думаю, что нашел один, но еще не уверен, как сделать его доступным для моего запроса на улей: https://issues.apache.org/jira/secure/attachment/12619610/hive-6006.patch – Roger

0

Apache HivemallHaversine 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; 
Смежные вопросы