Apache Hive — статическое разбиение с примерами

Опубликовано: 6 Октября, 2022

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

Предположим, у нас есть таблица student , содержащая 5000 записей, и мы хотим обрабатывать данные только об учащихся, принадлежащих только к разделу «A». Однако таблица учеников содержит записи учеников, принадлежащие ко всем разделам (A, B, C, D), но с разделением нам не нужно обрабатывать все эти 5000 записей. Здесь разделение помогает нам разделить данные студентов по их разделам. При этом время выполнения запроса будет увеличено, и нам не нужно сканировать все остальные ненужные данные, доступные внутри таблицы «студент».

Разделение в улье может быть статическим или динамическим. В этой статье мы реализуем статическое разбиение в улье.

Особенности статического разбиения

  • Разделы добавляются вручную, поэтому они также известны как ручные разделы.
  • Загрузка данных при статическом разбиении выполняется быстрее по сравнению с динамическим разбиением, поэтому статическое разбиение предпочтительнее, когда у нас есть большие файлы для загрузки.
  • При статическом разбиении отдельные файлы загружаются в соответствии с разделом, который мы хотим установить.
  • где предложение используется для использования лимита в статическом разделе
  • Изменение раздела в статическом разделе разрешено, тогда как динамический раздел не поддерживает оператор Alter.

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

Шаг 1. Запустите весь демон Hadoop

start-dfs.sh                    # this will start namenode, datanode and secondary namenode
start-yarn.sh                   # this will start node manager and resource manager 
jps                             # To check running daemons

Шаг 2: Запустите куст из терминала

hive

Теперь все готово для быстрой демонстрации.

Статическое разбиение

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

Шаг 1: Давайте создадим таблицу «студент» со следующими атрибутами (имя_студента, имя_отца и процент) и разделим ее, используя «раздел» в нашей базе данных по умолчанию.

Примечание. Не указывайте имя секционированного столбца в операторе create table <table-name> . Как только вы упомянули имена в операторе partitioned by , они автоматически разделятся с соответствующими атрибутами в таблице куста.

CREATE TABLE student(student_name STRING ,father_name  STRING ,percentage FLOAT)
partitioned by (section STRING)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ",";

Шаг 2. Опишите таблицу, чтобы просмотреть информацию об атрибутах таблицы и разделенных столбцах.

describe student;

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

Шаг 3: Создайте 4 разных файла, содержащих данные учащихся из соответствующих разделов (учащийся-A, учащийся-B, учащийся-C, учащийся-D), убедитесь, что столбец раздела , который является нашим столбцом раздела, никогда не добавляется в реальную таблицу.

Шаг 4: Загрузите данные из 4 разных файлов, содержащих данные о студентах по разделам, в нашу таблицу студентов вместе со значением секционированного атрибута.

а. Загрузка данных из student_A, разделенного на раздел «A»

LOAD DATA LOCAL INPATH "/home/dikshant/Documents/student_A" INTO TABLE student
partition(section = "A");

б. Загрузка данных из student_B, разделенного на раздел «B»

LOAD DATA LOCAL INPATH "/home/dikshant/Documents/student_B" INTO TABLE student
partition(section = "B");

в. Загрузка данных из student_C, разделенного разделом «C»

LOAD DATA LOCAL INPATH "/home/dikshant/Documents/student_C" INTO TABLE student
partition(section = "C");

д . Загрузка данных из student_D, разделенного разделом «D»

LOAD DATA LOCAL INPATH "/home/dikshant/Documents/student_D" INTO TABLE student
partition(section = "D");

Шаг 5: Теперь перейдите в свою HDFS (/user/hive/warehouse/) и проверьте таблицу учеников, чтобы увидеть, как создаются разделы.

Здесь мы можем легко заметить, что таблица студентов разделена и содержит данные о студентах в соответствии с их разделом. Теперь, если мы хотим обработать данные студента, принадлежащего section_A, нам не нужно проходить всю таблицу, поскольку она разделена. Каждый раздел содержит данные таблицы в соответствии с указанным разделом.

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

select * from student;

Теперь, если мы поработаем с этой студенческой таблицей с предложением where, как показано ниже. Hive никогда не будет запрашивать все эти 12 записей. Это просто обработка сделанного нами раздела в этой таблице учеников. В нашем случае он будет запрашивать только раздел section=A .

select * from student where section="A";

Вот как мы выполняем статическое разбиение в улье.