Присоединиться к таблице, используя 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
Другие вопросы по тегам