Является ли разделение улья иерархическим по своей природе?

hive

415 просмотра

1 ответ

896 Репутация автора

Скажем, у нас есть таблица, разделенная на:

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). И комбинация_ид будет комбинацией дополненных (если однозначное значение дополнено 0 слева) для всех этих значений. Так, в этом случае, например, идентификатор комбинации является 2016071813.

Итак, мы запускаем запрос (назовем это Query A ): -

select * from mytable where combination_id = 2016071813

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

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

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

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

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

select * from mytable where combination_id between 2016071813 and 2016071823

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

Автор: Dhiraj Источник Размещён: 18.07.2016 08:11

Ответы (1)


1 плюс

862 Репутация автора

Решение

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

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

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

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

Year, month, day, hour columns

или же

combination_id only

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

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

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

Автор: Munesh Размещён: 18.07.2016 08:39
Вопросы из категории :
32x32