Пять способов соединения в улье, конечно, возможны, а также (естественно), вероятно, медленно и очень медленно.
Вы должны рассмотреть вопрос о совместном секционирования таблиц на
- идентичных колонн перегородок
- одинаковое количество разделов
Другие варианты включают намеки. Например, рассмотрите, была ли одна из таблиц большой, а другие - маленькими. После этого вы можете быть в состоянии использовать streamtble намек
Предполагая большой:
SELECT /*+ STREAMTABLE(a) */ a.val, b.val, c.val, d.val, e.val
FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1) join d on (d.key = c.key) join e on (e.key = d.key)
адаптировано из: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Joins :
Все пять таблиц соединены в одиночная карта/сокращение задания и значения для конкретного значения ключа для таблиц b, c, d и ea re буферизуется в памяти редукторов. Затем для каждой строки, полученной от от a, объединение вычисляется с помощью буферизованных строк. Если подсказка STREAMTABLE опущена, то Hive поточает самую правую таблицу в соединении .
Другой намек является mapjoin, что полезно для кэширования небольших таблиц в памяти.
Предполагая большой и Ь, с, d, е достаточно мал, чтобы поместиться в памяти каждого картографа:
SELECT /*+ MAPJOIN(b,c,d,e) */ a.val, b.val, c.val, d.val, e.val
FROM a JOIN b ON (a.key = b.key1) JOIN c ON (c.key = b.key1)
join d on (d.key = c.key) join e on (e.key = d.key)
Спасибо Джереми Борода !! Я изучаю, как я могу улучшить производительность запроса присоединения hive, что будет оптимальной практикой для таких объединений оптимизированным способом. –