2016-07-18 1 views
1

Скажет, у нас есть таблица разбита на разделы как: -Является ли разделение кустов иерархическим по своей природе?

CREATE EXTERNAL TABLE MyTable (
col1 string, 
col2 string, 
col3 string 
) 
PARTITIONED BY(year INT, month INT, day INT, hour INT, combination_id BIGINT); 

Теперь, очевидно, год будет хранить год значение (например, 2016 г.), месяц будет хранить месяц va.ue (например, 7) день будет хранить день (например, 18), а час будет хранить значение часа в 24-часовом формате (например, 13). Комбинация_id будет комбинацией проложенных (если однозначное значение имеет значение «0 слева») для всех этих значений. Таким образом, в данном случае, например, комбинация идентификатор 2016071813.

Так обстреливает запрос (позволяет называть его запрос по): -

select * from mytable where combination_id = 2016071813 

Теперь улей не знает, что combination_id на самом деле сочетание год, месяц, день и час. Так будет ли этот запрос не использовать надлежащее преимущество разделения?

Другими словами, если у меня есть еще один запрос, назовем его Query B, будет ли это более оптимальным, чем запроса А или нет никакой разницы: -

select * from mytable where year=2016 and month=7 and day=18 and hour=13 

Если улей схема разбиения действительно иерархическая по своей природе, то запрос B должен быть лучше с точки зрения производительности - это то, о чем я думаю. На самом деле, я хочу решить, нужно ли вообще избавиться от comb_id от схемы разбиения, если это вообще не способствует повышению производительности.

Единственное реальное преимущество для использования комбинации идентификатор, чтобы иметь возможность использовать МЕЖДУ оператор выбора: -

select * from mytable where combination_id between 2016071813 and 2016071823 

Но если это не будет воспользоваться схемой разбиения, она собирается препятствовать выполнению.

+1

Run 'объяснить выбор ....'для обоих запросов и проверить план выполнения. Это должно дать вам некоторые подсказки о том, как оптимизатор Hive выполняет «разделение разделов». –

ответ

0

Да. Разделение кустов является иерархическим. Вы можете просто проверить это, распечатав разделы таблицы, используя следующий запрос.

show partitions MyTable; 

Выход:

year=2016/month=5/day=5/hour=5/combination_id=2016050505 
year=2016/month=5/day=5/hour=6/combination_id=2016050506 
year=2016/month=5/day=5/hour=7/combination_id=2016050507 

В вашем случае вам не нужно указывать combination_id в колонке раздела, если вы не используете для запроса.

Вы можете разделить либо

Year, month, day, hour columns 

или

combination_id only 

Разбиение по нескольким столбцам помогает в производительности в группировке операций.

Скажите, если вы хотите найти максимум col1 для «мартовских» месяцев лет (2016 & 2015).

Он может легко извлечь записи, перейдя в раздел удельных «года» (год = 2016/2015) и месяц (раздел месяц = ​​3)

+0

Итак, в ситуации, когда у вас есть раздел на год, месяц, день, час, comb_id в этом порядке, а затем вы только запрашиваете на partition_id - это означает, что производительность будет плохой по сравнению с запросом на год, месяц, день, час (в этой последовательности) правильно? – Dhiraj

+1

Справа. В вашем случае, если вы знаете comb_id, то знаете год, месяц, день, час. Так что лучше запросить конкретные столбцы года, месяца, .. с разбиением на эти столбцы – Munesh

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