Сегментация в 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.