Присоединиться к таблице, используя LIKE или RLIKE в Hive
Я пытаюсь (ВНУТРЕННИЙ) объединить две таблицы в Hive, используя RLIKE.
select a.col_x, b.col_y, count(*) as n
from tableA a
join tableB b
ON a.col_x RLIKE concat('^', b.col_z)
group by a.col_x, b.col_y
(tableA ок. 100M записей, tableB ок. 1k записей)
Этот запрос не будет работать, так как Hive поддерживает только равенство.
Я перемещаю неравенства в where
предложение (ссылка: Ошибка в Hive Query при соединении таблиц).
select a.col_x, b.col_y, count(*) as n
from tableA a , tableB b
WHERE a.col_x RLIKE concat('^', b.col_z)
group by a.col_x, b.col_y
Второй подход не возвращает никакой ошибки. Тем не менее, он работает очень медленно. Запустите примерно 1 час, но все еще не можете получить вывод (обычно, когда я использую равенство соединения ON a.col_x RLIKE b.col_z
это нужно всего менее 5 минут).
Любое решение (с использованием Hive или других приложений Hadoop) приветствуется.
2 ответа
Да, "Hive не поддерживает условия объединения, которые не являются условиями равенства, поскольку очень трудно выразить такие условия как сопоставление / сокращение задания". Я понимаю, что это означает как равные, так и естественные соединения (как ваш второй пример).
Я хотел бы изучить CROSS JOIN с условием RLIKE в предложении WHERE. В зависимости от размера ваших данных, вам может потребоваться выполнить запрос для каждого раздела.
В Pig вы также можете выполнять перекрестную операцию, а затем фильтровать по вашим условиям, подобно тому, как это делается в этом посте.
В этом конкретном случае вы можете легко заменить условие неравенства равенством одно:
a.col_x RLIKE concat('^', b.col_z)
такой же как
substr(a.col_x,1,length(b.col_z))=b.col_z