Я натолкнулся на упражнение, в котором предлагается сопоставить связанные с событиями IP-адреса из одной таблицы с диапазонами IP-адресов стран из другой таблицы.Т.е. это может выглядеть так (упрощенно):
table: events
event_id | source_ip
----------------------
12345678 | 3.15.49.5
31234314 | 7.1.8.190
table: geoips
country | start_ip | end_ip
-----------------------------------
us | 1.0.0.0 | 1.127.255.255
us | 1.128.0.0 | 1.255.255.255
us | 3.0.0.0 | 3.255.255.255
и мы хотим получить:
event_id | source_ip | country
----------------------------------
12345678 | 3.15.49.5 | us
31234314 | 7.1.8.190 | uk
Предположим, мы можем преобразовать IP в целые числа, чтобы упростить сравнение (или преобразовать в ноль)-пополненные строки, чтобы их можно было сравнивать в алфавитном порядке).
Так похоже на объединение on event_ip >= start_ip and event_ip <= end_ip
.Однако, насколько я понимаю, в Hive это не сработает так просто, поскольку «поддерживаются только объединения с равенством».
Чаще всего (и в этом упражнении) предлагается использовать UDF - насколько я понимаю, это тольковозможно, если таблица с диапазоном помещается в памяти.
Хотя я знаю, как писать UDF, я не удовлетворен этим подходом.Тем более, что в нем не сказано, что делать, если таблица диапазонов очень велика (конечно, не в этом случае) и не умещается в памяти легко.
Интуитивно кажется, что, кроме Hive, еслиу нас есть обе таблицы, отсортированные по IP, мы можем решить проблему за один проход, поддерживая «текущий диапазон» и сопоставляя с ним все будущие IP-адреса, а затем обновляя до следующего диапазона.Это даже должно быть достаточно просто для распараллеливания ...
Так что мне интересно, если (возможно, в более поздних версиях Hive) есть решение, основанное на самом HQL.