2015-03-13 3 views
1

Я перенесла данные таблицы Teradata в улей.Несколько столов присоединяются к улью

Теперь мне нужно собрать сводные таблицы поверх импортированных данных. Сводная таблица должна быть построена из пяти исходных таблиц

Если я поеду с объединениями, мне нужно будет соединить пять таблиц, возможно ли это в улье? или я должен разбить запрос в пяти частях? Каким должен быть подход для решения этой проблемы?

Пожалуйста, предложите

ответ

0

Да, вы можете join multiple tables в одном запросе. Это позволяет многим возможным для Hive делать оптимизацию, которая не может быть выполнена, если вы разделили ее на отдельные запросы.

+0

Спасибо Джереми Борода !! Я изучаю, как я могу улучшить производительность запроса присоединения hive, что будет оптимальной практикой для таких объединений оптимизированным способом. –

10

Пять способов соединения в улье, конечно, возможны, а также (естественно), вероятно, медленно и очень медленно.

Вы должны рассмотреть вопрос о совместном секционирования таблиц на

  • идентичных колонн перегородок
  • одинаковое количество разделов

Другие варианты включают намеки. Например, рассмотрите, была ли одна из таблиц большой, а другие - маленькими. После этого вы можете быть в состоянии использовать 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) 
+0

эй спасибо! Я изучаю, как я могу улучшить выполнение команды hive join –

+0

@chhayavishwakarma. Да - и этот ответ предоставляет эти методы. – javadba

Смежные вопросы