Сегментация в Hive: создание таблицы с сегментацией в Hive

Опубликовано: 2021-02-17

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

Эта статья расскажет вам о том, как выполнять группирование в Hive. Мы рассмотрим несколько реализаций этой функции на примерах.

Оглавление

Что такое сегментация в Hive?

Сегментирование — это метод организации данных. Хотя секционирование и группирование в Hive — очень похожие концепции, группирование предлагает дополнительные функции разделения больших наборов данных на более мелкие и более управляемые наборы, называемые сегментами.

С помощью группировки в Hive вы можете разбить набор табличных данных на более мелкие части, что упрощает работу с ними. Разделение на группы позволяет группировать схожие типы данных и записывать их в один файл, что повышает производительность при объединении таблиц или чтении данных. Это основная причина, по которой мы чаще всего используем группировку с секционированием.

Когда мы используем ведро?

Бухгалтерия — очень полезная функция. Если вы не использовали ее раньше, вам следует помнить о следующих моментах, чтобы определить, когда использовать эту функцию:

  • Когда столбец имеет большое количество элементов, мы не можем выполнить его секционирование. Очень большое количество разделов создаст слишком много файлов Hadoop, что увеличит нагрузку на узел. Это связано с тем, что узлу придется хранить метаданные каждого раздела, а это повлияет на производительность этого узла.
  • Вы должны использовать сегментацию, если ваши запросы имеют несколько соединений на стороне карты. Соединение на стороне карты — это процесс, в котором вы соединяете две таблицы, используя только функцию карты без использования функции сокращения.

Основные моменты сегментации в Hive

Разделение основано на хеш-функции, поэтому оно имеет следующие особенности:

  • Функция hash_function зависит от типа столбца сегментации, который у вас есть.
  • Вы должны иметь в виду, что записи с одним и тем же сегментированным столбцом будут храниться в одном и том же сегменте.
  • Эта функция требует, чтобы вы использовали предложение Clustered By для разделения таблицы на сегменты.
  • В каталоге таблицы нумерация корзин начинается с 1, и каждая корзина представляет собой файл.
  • Пакетирование — это отдельная функция. Это означает, что вы можете выполнять группирование без разделения таблицы.
  • Сегментированная таблица создает почти одинаково распределенные разделы файла данных.
  • Обратите внимание, что группировка не гарантирует, что ваша таблица будет правильно заполнена. Таким образом, вам придется самостоятельно управлять загрузкой данных в корзины, что может быть обременительно.

Читайте: Улей против Искры

Сегментация в Hive: пример №1

Лучше всего понять группировку в Hive на примере. Для нашего примера мы будем использовать следующие данные:

ЭМПИД ИМЯ ФАМИЛИЯ СПОРТИВНЫЙ ГОРОД СТРАНА
1001 Эмерри Блэр Баскетбол Кутубуллапур Сан-Марино
1002 Зефр Стефенсон Крикет Неерхарен Доминиканская Респблика
1003 Осень Бин Баскетбол Неерхарен Доминиканская Респблика
1004 Казимир Вэнс Бадминтон Неерхарен Доминиканская Респблика
1005 Муфутау Флорес Кутубуллапур Сан-Марино
1006 Аянна банки Футбол Неерхарен Доминиканская Респблика
1007 Сельма Мяч Теннис Кутубуллапур Сан-Марино
1008 Берк Фуллер Бадминтон Неерхарен Доминиканская Респблика
1009 Имогена Террелл Кутубуллапур Сан-Марино
1010 Колорадо Хатчинсон Теннис Кутубуллапур Сан-Марино

Наши образцы данных содержат информацию о сотрудниках спортивной команды. Однако некоторые из сотрудников не являются частью какой-либо команды.

Вот примеры данных, которые вы можете скопировать и вставить вместе с этим примером:

id, Имя, Фамилия, Спорт, Город, Страна

1001, Эмерри, Блэр, Баскетбол, Кутубуллапур, Сан-Марино

1002, Zephr, Stephenson, Cricket, Neerharen, Доминиканская Республика

1003, Осень, Фасоль, Баскетбол, Neerharen, Доминиканская Республика

1004, Казимир, Вэнс, Бадминтон, Нирхарен, Доминиканская Республика

1005, Муфутау, Флорес, Кутубуллапур, Сан-Марино

1006, Аянна, Банки, Футбол, Неерхарен, Доминиканская Республика

1007, Сельма, Мяч, Теннис, Кутубуллапур, Сан-Марино

1008, Берк, Фуллер, Бадминтон, Неерхарен, Доминиканская Республика

1009, Имоджен, Террелл, Кутубуллапур, Сан-Марино

1010, Колорадо, Хатчинсон, Теннис, Кутубуллапур, Сан-Марино

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

Создание базовой таблицы

Во-первых, мы создадим таблицу с именем employee_base:

СОЗДАТЬ ТАБЛИЦУ db_bdpbase.employee_base (

эмплид INT,

имя STRING,

фамилия STRING,

спорт СТРИНГ,

город STRING,

страна STRING

)

ФОРМАТ СТРОК С РАЗДЕЛИТЕЛЯМИ

ПОЛЯ, ЗАКРЫВАЕМЫЕ ','

ХРАНИТСЯ В ТЕКСТОВОМ ФАЙЛЕ

TBLPROPERTIES («skip.header.line.count» = «1»);

В наших примерных данных есть заголовок, который не нужен для группирования, поэтому мы удалим его, добавив свойство «пропустить заголовок».

Загрузка данных в базовую таблицу

Мы будем использовать расположение «/usr/bdp/hive/sample_data.csv» для наших образцов данных и использовать следующую команду для загрузки их в таблицу:

ЗАГРУЗИТЬ ДАННЫЕ INPATH '/user/bdp/hive/sample_data.csv' В ТАБЛИЦУ db_bdpbase.employee_base;

Создание таблицы с сегментами

В этом разделе мы создадим таблицу с сегментами. Теперь мы можем сделать разделенную таблицу с разделом или без раздела.

Ковшовый стол с перегородкой

В этом случае страна является столбцом раздела, и мы разбили столбец empid, который мы отсортировали в порядке возрастания:

СОЗДАТЬ ТАБЛИЦУ db_bdpbase.bucketed_partition_tbl (

эмпид INT,

имя STRING,

фамилия STRING,

спорт СТРИНГ,

город STRING

) РАЗДЕЛЕН(страна STRING)

КЛАСТЕР ПО (жирный)

СОРТИРОВАТЬ ПО (empid ASC) НА 4 ВЕДРА;

Таблица с сегментами без раздела

В качестве альтернативы мы можем создать таблицу с сегментами без раздела:

СОЗДАТЬ ТАБЛИЦУ db_bdpbase.bucketed_tbl_only (

эмпид INT,

имя STRING,

фамилия STRING,

город STRING,

Страна STRING

)

КЛАСТЕР ПО (жирный)

СОРТИРОВАТЬ ПО (empid ASC) НА 4 ВЕДРА;

Здесь мы разбили таблицу на один и тот же столбец empid.

Установка свойства

Параметр по умолчанию для группирования в Hive отключен, поэтому мы включили его, установив для него значение true. Следующее свойство выберет количество кластеров и редукторов в соответствии с таблицей:

УСТАНОВИТЬ hive.enforce.bucketing=ИСТИНА; (НЕ требуется В Hive 2.x и выше)

Загрузка данных в таблицу с сегментами

На данный момент мы создали две таблицы с сегментами и базовую таблицу с нашими примерами данных. Теперь мы загрузим данные в сегментированную таблицу из базовой таблицы, используя следующую команду в сегментированной таблице с разделом:

ВСТАВИТЬ ПЕРЕЗАПИСАННУЮ ТАБЛИЦУ db_bdpbase.bucketed_partition_tbl РАЗДЕЛ (страна) SELECT * FROM db_bdpbase.employee_base;

Чтобы загрузить данные в таблицу с сегментами без каких-либо разделов, мы будем использовать следующую команду:

ВСТАВИТЬ ТАБЛИЦУ ПЕРЕЗАПИСЬ db_bdpbase.bucketed_tbl_only SELECT * FROM db_bdpbase.employee_base;

Проверка данных таблицы с сегментами

После загрузки данных в таблицу с сегментами мы проверим, как они хранятся в HDFS. Мы будем использовать следующий код для проверки сегментированной таблицы с разделом:

hadoop fs -ls hdfs://sandbox.hortonworks.com:8020/apps/hive/warehouse/db_bdpbase.db/bucketed_partition_tbl

Хранение данных в сегментированных таблицах

Каждая точка данных сопоставляется с конкретной в соответствии со следующей формулой:

режим hash_function(bucket_column) num_bucket

Теперь рассмотрим первую таблицу, которую мы разделили по странам. Наш образец данных будет разделен на следующие разделы:

ЭМПИД ИМЯ ФАМИЛИЯ СПОРТИВНЫЙ ГОРОД СТРАНА
1002 Зефр Стефенсон Крикет Неерхарен Доминиканская Респблика
1003 Осень Бин Баскетбол Неерхарен Доминиканская Респблика
1004 Казимир Вэнс Бадминтон Неерхарен Доминиканская Респблика
1006 Аянна банки Футбол Неерхарен Доминиканская Респблика
1008 Берк Фуллер Бадминтон Неерхарен Доминиканская Респблика

ЭМПИД ИМЯ ФАМИЛИЯ СПОРТИВНЫЙ ГОРОД СТРАНА
1001 Эмерри Блэр Баскетбол Кутубуллапур Сан-Марино
1005 Муфутау Флорес Кутубуллапур Сан-Марино
1007 Сельма Мяч Теннис Кутубуллапур Сан-Марино
1009 Имогена Террелл Кутубуллапур Сан-Марино
1010 Колорадо Хатчинсон Теннис Кутубуллапур Сан-Марино

Для Доминиканской Республики каждая строка будет храниться в корзине:

hash_function(1002) mode 4 = 2 (представляет индекс корзины)

hash_function(1003) режим 4 = 3

hash_function(1004) режим 4 = 0

hash_function(1006) режим 4 = 2

hash_function(1008) режим 4 = 0

Обратите внимание, что хеш-функция значения INT даст вам тот же результат. Вы можете проверить данные в каждом файле в расположении HDFS. При желании вы можете повторить этот процесс для других стран, присутствующих в базе данных.

Сегментация в Hive: Пример №2

Поскольку мы уже рассмотрели различные шаги и процедуры, связанные с реализацией этой функции, мы можем легко ее опробовать. Ниже приведен простой пример группировки в Hive. Здесь мы только разбили доступные данные на разные части, чтобы нам было легче ими управлять:

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> создать таблицу month_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> (символ месяца (7), флот smallint, компания varchar (50))

. . . . . . . . . . . . . . . . . . . . . . .> сгруппировано (компанией) в 3 сегмента

. . . . . . . . . . . . . . . . . . . . . . .> хранится как avro;

Пример использования Apache Hive версии 1.1.0-cdh5.13.1, hive.enforce.bucketing=false по умолчанию

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> вставить в month_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> выберите месяц, автопарк, компанию из month_taxi_fleet;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6

-rwxrwxrwt 1 обновить куст 25483 26.12.2017 10:40 /user/hive/warehouse/monthly_taxi_fleet6/000000_0

— hive.enforce.bucketing: применяется ли группировка. Если true, при вставке в таблицу применяется группировка.

— Значение по умолчанию: Hive 0.x: false, Hive 1.x: false, Hive 2.x: удалено, что делает его всегда истинным (HIVE-12331).

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> установить hive.enforce.bucketing=true;

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> вставить в month_taxi_fleet6

. . . . . . . . . . . . . . . . . . . . . . .> выберите месяц, автопарк, компанию из month_taxi_fleet;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet6

-rwxrwxrwt 1 обновить куст 13611 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000000_0

-rwxrwxrwt 1 обновить куст 6077 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000001_0

-rwxrwxrwt 1 обновить куст 6589 2017-12-26 10:43 /user/hive/warehouse/monthly_taxi_fleet6/000002_0

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> описать расширенный month_taxi_fleet6;

+—————————+——————————————————+———-+—+

| имя_столбца | тип_данных | комментарий |

+—————————+——————————————————+———-+—+

| месяц | символ (7) | |

| флот | инт | |

| компания | varchar(50) | |

| | НУЛЕВОЙ | НУЛЕВОЙ |

| Подробная информация о таблице | Table(tableName:monthly_taxi_fleet6, dbName:default, owner:upgrade, createTime:1514256031, lastAccessTime:0, Retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:month, type:char(7), comment:null) , FieldSchema (имя: флот, тип: smalllint, комментарий: null), FieldSchema (имя: компания, тип: varchar (50), комментарий: null)], местоположение: hdfs://cdh-vm.dbaglobe.com:8020 /user/hive/warehouse/monthly_taxi_fleet6, inputFormat: org.apache.hadoop.hive.ql.io.avro.AvroContainerInputFormat, outputFormat: org.apache.hadoop.hive.ql.io.avro.AvroContainerOutputFormat, сжатый: false, numBuckets :3, serdeInfo:SerDeInfo(name:null, serializationLib:org.apache.hadoop.hive.serde2.avro.AvroSerDe, параметры:{serialization.format=1}), BucketCols:[company], sortCols:[], параметры :{}, skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), StoredAsSubDirectories:false), partitionKeys:[], параметры:{totalSize=26277, numRows=1128, rawDataSize=0, COLUMN_STATS_ACCURATE =true, numFiles=3, тра nsient_lastDdlTime=1514256192}, viewOriginalText:null, viewExpandedText:null, tableType:MANAGED_TABLE) | |

+—————————+——————————————————+———-+—+

Выбрано 5 строк (0,075 секунды)

Оформить заказ: основные вопросы интервью Hive

Сегментация в Hive: Пример №3

Ниже приведен небольшой расширенный пример группировки в Hive. Здесь мы выполнили разбиение и использовали функцию «Сортировка по», чтобы сделать данные более доступными. Это одно из самых больших преимуществ ковширования. Вы можете использовать его с другими функциями для более эффективного и действенного управления большими наборами данных.

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> создать таблицу month_taxi_fleet7

. . . . . . . . . . . . . . . . . . . . . . .> (символ месяца (7), малый размер флота)

. . . . . . . . . . . . . . . . . . . . . . .> разделен (компания varchar(50))

. . . . . . . . . . . . . . . . . . . . . . .> сгруппировано по (месяцу) отсортировано по (месяцу) в 3 сегмента

. . . . . . . . . . . . . . . . . . . . . . .> хранится как avro;

0: jdbc:hive2://cdh-vm.dbaglobe.com:10000/def> вставить в month_taxi_fleet7

. . . . . . . . . . . . . . . . . . . . . . .> раздел (компания)

. . . . . . . . . . . . . . . . . . . . . . .> выберите месяц, автопарк, компанию из month_taxi_fleet;

[upgrad@cdh-vm ~]$ hdfs dfs -ls -R /user/hive/warehouse/monthly_taxi_fleet7

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000000_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000001_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=CityCab/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort

-rwxrwxrwt 1 обновить куст 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000000_0

-rwxrwxrwt 1 обновить куст 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000001_0

-rwxrwxrwt 1 обновить куст 913 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Comfort/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow-Top

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000000_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000001_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Individual Yellow- Top/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000000_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000001_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Premier/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime

-rwxrwxrwt 1 обновить куст 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000000_0

-rwxrwxrwt 1 обновить куст 765 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000001_0

-rwxrwxrwt 1 обновить куст 766 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Prime/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000000_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000001_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=SMRT/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart

-rwxrwxrwt 1 обновить куст 720 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000000_0

-rwxrwxrwt 1 обновить куст 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000001_0

-rwxrwxrwt 1 обновить куст 719 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=Smart/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000000_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000001_0

-rwxrwxrwt 1 обновить куст 865 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=TransCab/000002_0

drwxrwxrwt — обновить куст 0 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC

-rwxrwxrwt 1 обновить куст 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000000_0

-rwxrwxrwt 1 обновить куст 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000001_0

-rwxrwxrwt 1 обновить куст 432 2017-12-26 11:05 /user/hive/warehouse/monthly_taxi_fleet7/company=YTC/000002_0

Узнайте больше о секционировании и сегментировании в Hive

В примерах, которыми мы поделились ранее, мы выполняли секционирование и группировку в Hive несколькими способами и узнали, как их можно реализовать в Hive. Однако у Apache Hive есть много других функций, и изучение их всех может быть довольно сложным.

Вот почему мы рекомендуем пройти курс Data Engineering. Это позволит вам учиться у отраслевых экспертов, которые провели годы в этой отрасли. Курс предоставляет вам структурированный учебный план, где вы изучаете все шаг за шагом. В upGrad мы предлагаем специальные курсы по обработке данных .

Благодаря нашим курсам вы получаете доступ к «Уголку студенческого успеха» upGrad, где вы получаете персональные отзывы о резюме, подготовку к собеседованию, консультации по вопросам карьеры и многие другие преимущества.

После окончания курса вы станете квалифицированным специалистом по обработке данных.

Заключение

Сегментация в Hive очень проста и удобна в выполнении. Это, безусловно, полезная функция для больших наборов данных. Однако, когда вы одновременно выполняете секционирование и группировку в Hive, вы можете очень легко управлять довольно огромными наборами данных.

Если вам интересно узнать больше о программе Big Data, ознакомьтесь с нашей программой PG Diploma в области разработки программного обеспечения со специализацией в области больших данных, которая предназначена для работающих профессионалов и включает более 7 тематических исследований и проектов, охватывает 14 языков и инструментов программирования, практические советы. на семинарах, более 400 часов тщательного обучения и помощи в трудоустройстве в ведущих фирмах.

Если у вас есть какие-либо вопросы или мысли относительно корзины, поделитесь ими в комментариях ниже. Мы хотели бы услышать от вас.

Ознакомьтесь с другими нашими курсами по программной инженерии на upGrad.

Повышай свою квалификацию и будь готов к будущему

Расширенная программа сертификации в области больших данных от IIIT Bangalore