К сожалению, Вы также можете просто написать большую математическую функцию в запросе, если я понимаю, что вы используете дело правильно. Написание математической функции в запросе будет головной болью, но с точки зрения куста, она должна быть выполнимой.
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 миль и вашу точку в качестве аргументов и возвращает строки таблицы (lat, long), которые находятся в x милях для вашей точки аргумента. В UDF вы можете реализовать функцию для вычисления расстояния между точкой аргумента и строкой таблицы, предоставленной UDF. Возвращайтесь, если расстояние меньше x миль.
- Или вы можете использовать такие UDF/UDTF, уже написанные другими людьми. Это был открытый источник, который выиграл от этого. Вы можете взять библиотеку ESRI библиотеки, чтобы делать ваши вещи https://github.com/Esri/gis-tools-for-hadoop. Есть также множество других подобных библиотек.
Похожий вопрос на GIS.SE - http://gis.stackexchange.com/questions/185494/proximity-query-in-hive-using-esri-geospatial-library –