2013-12-12 3 views
1

У меня есть одна таблица (A) с фразой, а другая (B) - это фраза, которую я хочу найти фразой WITHIN table A. Поэтому я присоединяюсь к их следующим образом:Оптимизируйте соединение с регулярным выражением

Create table C as 
SELECT A.* 
FROM A 
JOIN B 
where (A.phrase LIKE concat("%",B.phrase,"%")); 

Это занимает много времени, потому что это только с помощью одного редуктора, и я считаю, что это связано с характером запроса? Есть ли способ ускорить это? Я не думаю, что mapjoin или bucketjoin помогли бы, потому что я не приравниваю два столбца, а скорее ищу в одной таблице слова из другой таблицы ...

+0

Я нашел решение. Проблема заключалась в том, что Hive не делает un equi хорошо соединяется. Таким образом, я сделал equi, чтобы получить подмножество таблицы A, прежде чем я сделал регулярное выражение un equi join. Итак, 3 шага. 1) Перерыв A.phrase и B.phrase в отдельные слова. 2) Обозначьте эти слова, чтобы увидеть, какие ключевые слова из B.phrase равны любым ключевым словам из A.phrase - это дает подмножество таблицы A, где A.phrase содержит по крайней мере одно ключевое слово из B.phrase. 3) Используйте эту таблицу. Подмножество, чтобы найти весь «% B.phrase%». – maia

+0

Спасибо за обновление! Пожалуйста, опубликуйте это как ответ, чтобы облегчить другим пользователям поиск вашего решения. – JDB

ответ

3

Я нашел решение.

Проблема была в том, что улей не делает non equi присоединяется хорошо. Итак, я сделал equi присоединяется к, чтобы получить подмножество таблицы A до того, как я сделал регулярное выражение non equi join. Итак, 3 шага.

  1. Перерыв A.phrase и B.phrase в отдельные слова.
  2. Присвойте эти слова, чтобы увидеть, какие ключевые слова из B.phrase равны любым ключевым словам из A.phrase - это дает подмножество таблицы A, где A.phrase содержит по крайней мере одно ключевое слово из B.phrase.
  3. Используйте эту таблицу Подмножество, чтобы найти весь «% B.phrase%».
1

Я думаю, что EXISTS может быть быстрее просто потому, что ваш запрос будет возвращать ту же строку из A несколько раз для каждого матча:

SELECT 
    A.* 
FROM A as a 
WHERE EXISTS (
    SELECT 
    1 
    FROM B 
    WHERE a.phrase LIKE concat("%",phrase,"%") 
); 
Смежные вопросы