В кусте вы создаете таблицу, основанную на шаблоне использования, и поэтому вы должны выбрать оба разбиения сегмента на основе того, как будут выглядеть ваши аналитические запросы.
Тем не менее, рекомендуется следующее:
Секционирование
- Секционирование помогает ускорить запросы с предикатами (т. Е. Условия условия).Так что в вашем случае, если
city_category
- это поле, которое вы будете использовать большую часть времени в вашем условии, где вы должны выбрать это поле для раздела. - Это может ухудшить производительность других запросов.
- Необходимо убедиться, что количество элементов не слишком велико, в противном случае производительность вашего запроса будет снижена.
Чтобы понять вышеперечисленные моменты, вам необходимо понять, как работает разбиение.Когда вы создаете раздел (или подраздел), Hive создает подпапку с этим именем и сохраняет данные (файлы) в эти папки.
Итак, если вы создадите раздел на основе city_category
, ваш файл будет выглядеть следующим образом.
/data/table_name/city_category=A
/data/table_name/city_category=B
...
/data/table_name/city_category=E
Это помогает кусту найти конкретную запись, если вы укажете city_category
в Where condition
, так как она должна сканировать только одну папку.
Однако, если вы попытаетесь найтиЗапись на основе user_id
или product_id
, затем куст должен сканировать все папки.
И скажем, если вы закончите разбиение на основе purchase_amount
, то у вас будет много папок.NameNode должен поддерживать расположение каждой папки и файлов, поэтому он создаст большую нагрузку на ваш NameNode и, очевидно, снизит производительность вашего запроса.
Группировка
- Это поможет вам ускорить запрос на объединение, если другая таблица, к которой вы присоединяетесь, имеет аналогичное группирование.
- Тем не менее, это хорошая идея, чтобы убедиться, что данные распределяются равномерно в сегментах.
Что делает группирование, оно применяет хеширование к заданному полю и на основании того, что оно сохраняет данную запись в сегменте.
Итак, скажем, если вы ведро на основе city_category
и предложите создать 50 сегментов.
CLUSTERED BY (city_category) INTO 50 BUCKETS
, поскольку у нас есть только 5 категорий, остальные 45 сегментов будут пустыми, это то, что вам не нужно, так как это ухудшит производительность вашего запроса.