Как выбрать столбцы для разбиения и группирования в таблице улья? - PullRequest
0 голосов
/ 13 марта 2019

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

user_id INTEGER UNSIGNED,
product_id VARCHAR(20),
gender ENUM('M','F') default NULL,
age VARCHAR(6),
occupation TINYINT UNSIGNED default NULL,
city_category ENUM('A','B','C','D','E') default NULL,
stay_in_current_city_years VARCHAR(6),
martial_status TINYINT UNSIGNED default 0,
product_category_1 TINYINT UNSIGNED default 0,
product_category_2 TINYINT  UNSIGNED default 0,
product_category_3 TINYINT UNSIGNED default 0,
purchase_amount INTEGER UNSIGNED default 0 

Основная цель - провести анализ на основе вышеуказанных атрибутов с использованием Hive.

1 Ответ

1 голос
/ 13 марта 2019

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

Тем не менее, рекомендуется следующее:

Секционирование

  • Секционирование помогает ускорить запросы с предикатами (т. Е. Условия условия).Так что в вашем случае, если 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 сегментов будут пустыми, это то, что вам не нужно, так как это ухудшит производительность вашего запроса.

...