2013-10-24 4 views
0

Выполняет ли «ПРАВИЛЬНАЯ ВСТРОЕННАЯ ВСТУПЛЕНИЕ» и «ВЛЕВОЕ ВЗАИМОДЕЙСТВИЕ» в HIVE?RIGHT/LEFT OUTER JOIN работают по-разному в HIVE?

Например, таблица А представляет собой небольшой стол. Таблица B намного больше и разделена на col2.

Запрос 1: SELECT * FROM A RIGHT OUTER JOIN B on (A.col=B.col) WHERE B.col2>20131001

Запрос 2: SELECT * FROM A LEFT OUTER JOIN B on (A.col=B.col) WHERE B.col2>20131001

Query 1 просматривает только небольшое количество разделов, но Query 2 сканирует все разбиения таблицы B. Является ли это ошибка или я что-то пропустил ?

Спасибо!

+0

Вы имеете в виду секционирования в 'col2' (время), а фильтр 'B.col2> 20131001' не сокращает разделы во втором случае? Можете ли вы опубликовать планы EXPLAIN для этих двух? –

+0

Вы также должны прочитать [MapJoin & Partition Pruning] (https://cwiki.apache.org/confluence/pages/viewpage.action?pageId=34015666) и посмотреть, подходит ли ваш случай описанию проблемы. –

ответ

0

Я испытал то же самое (не знаю, почему это, ошибка или функция. Я считаю это определённо ошибкой). Поскольку левое внешнее соединение активно используется мной, я использую следующий обходной путь:

SELECT * 
FROM A 
LEFT OUTER JOIN 
    (SELECT * 
    FROM B 
    WHERE B.COL2 >20131001) ON (A.COL=B.COL) 

или

SELECT * 
FROM A 
LEFT OUTER JOIN B ON (A.COL= B.COL 
         AND B.COL2 > 20131001) 

Я работаю на улей 0.11 ... было бы интересно, если это зафиксировано в более поздних версии.

0

Query 1 table B сохранен в таблице, так что B, где предикат является нажатием.

Запрос 2 таблицы B не сохраняется таблица так B, где предикат не pushdown.hive будет сканировать всю таблицу В

см это более подробно OuterJoinBehavior