Примеры запросов Hive: ORDER BY, GROUP BY и т. д. Cluster By

⚡ Умное резюме

В запросах Hive используются предложения ORDER BY, GROUP BY, SORT BY, CLUSTER BY и DISTRIBUTE BY для сортировки, группировки и распределения строк между редукторами, и каждое предложение демонстрируется здесь на примере одной таблицы сотрудников.

  • 🧱 Сначала рассмотрим пример таблицы: Поле employees_guru содержит шесть столбцов и загружается из файла Employees.txt до выполнения каких-либо условий.
  • 🔢 Итого по сортировке: Оператор ORDER BY отправляет весь набор результатов одному редуктору, что гарантирует полный порядок, но замедляет выполнение больших запросов.
  • 🔤 Сортировка строк: Столбец, содержащий строки, например, «Department», возвращается в лексикографическом, а не числовом порядке.
  • 📊 GROUP BY подсчитывает: Сочетание GROUP BY с count(*) возвращает по одной строке для каждого отдела с указанием общего количества сотрудников.
  • 🔀 Сортировка по выполняется для каждого редуктора: Оператор SORT BY упорядочивает строки внутри каждого редуктора, поэтому несколько редукторов выдают частично упорядоченные результаты.
  • 🎯 CLUSTER BY объединяет в себе: CLUSTER BY действует как DISTRIBUTE BY плюс SORT BY, тогда как DISTRIBUTE BY сам по себе направляет совпадающие ключи в один несортированный редуктор.

Запросы Hive: сортировка, группировка, Cluster Распространяется и управляется

Hive предоставляет язык запросов типа SQL для целей ETL, работающий поверх... Hadoop файловая система.

Язык запросов Hive (HiveQL) предоставляет в Hive среду, аналогичную SQL, для работы с таблицами, базами данных и запросами.

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

Запросы Hive предоставляют следующие возможности:

  • Моделирование данных, например, создание баз данных, таблиц и т. д.
  • Функциональные возможности ETL, такие как, например,tracпреобразование, трансформация и загрузка данных в таблицы.
  • Играя объединить разные таблицы данных
  • Специальные пользовательские сценарии для упрощения написания кода.
  • Инструмент более быстрого запроса на базе Hadoop

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

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

В этом уроке мы создадим таблицу «employees_guru» с 6 столбцами, как показано на скриншоте ниже.

Оператор Hive CREATE TABLE для employees_guru и команда загрузки

Судя по приведенному выше снимку экрана,

  1. Мы создаём таблицу «employees_guru» с шестью столбцами, содержащими значения Id, Name, Age, Address, Salary, Department, которые относятся к сотрудникам организации «guru».
  2. На этом этапе мы загружаем данные в таблицу employees_guru. Данные, которые мы будем загружать, находятся в файле Employees.txt.

Упорядочить по запросу

Синтаксис оператора ORDER BY в HiveQL аналогичен синтаксису оператора ORDER BY в... SQL язык.

ORDER BY — это условие, которое мы используем с оператором “SELECT”. Запросы улья Для сортировки данных. Для сортировки значений столбцов, указанных с помощью оператора ORDER BY, используются столбцы таблиц Hive, а результаты запроса отображаются в порядке возрастания или убывания этих значений.

Если указанное поле ORDER BY является строкой, то результат отображается в лексикографическом порядке. На стороне сервера весь результирующий набор должен быть передан в один редуктор.

Этот единственный редуктор также делает операцию ORDER BY дорогостоящей при работе с большими таблицами, поэтому в строгом режиме (hive.mapred.mode=strictHive отклоняет ORDER BY, не содержащий пункта LIMIT.

На скриншоте ниже показан запрос ORDER BY и отсортированные по нему строки.

Запрос ORDER BY по данным employees_guru, отсортированный по отделу.

На приведенном выше скриншоте можно заметить следующее:

  1. Это запрос, выполненный к таблице «employees_guru» с использованием предложения ORDER BY и столбца «Department», определенного в качестве имени столбца ORDER BY. «Department» — это строка, поэтому результаты отображаются в лексикографическом порядке.
  2. Это фактический результат выполнения запроса. Результаты отображаются в порядке следования по столбцу «Отдел», например, «Администрация», «Финансы» и так далее.

Запрос:

SELECT * FROM employees_guru ORDER BY Department;

Группировать по запросу

В предложении GROUP BY используются столбцы таблиц Hive для группировки.ping Указанные значения столбца, заданные с помощью оператора GROUP BY, используются в запросе, который выбирает и отображает результаты, сгруппированные по этим значениям.

Например, на скриншоте ниже показано общее количество сотрудников, присутствующих в каждом отделе. Здесь в качестве значения для группировки используется «Отдел».

Запрос GROUP BY, подсчитывающий количество сотрудников в каждом отделе.

На приведенном выше скриншоте мы увидим следующее:

  1. Это запрос, выполняемый к таблице «employees_guru» с использованием предложения GROUP BY и столбца Department, определенного в качестве имени столбца GROUP BY.
  2. Здесь представлены название отдела и количество сотрудников в каждом отделе. Все сотрудники, принадлежащие к определенному отделу, сгруппированы и отображены, поэтому каждая строка результатов содержит название отдела и общее количество сотрудников в нем.

Запрос:

SELECT Department, count(*) FROM employees_guru GROUP BY Department;

Сортировать по:

Оператор SORT BY выполняет сортировку результатов по именам столбцов таблиц Hive. Для сортировки в порядке убывания можно использовать DESC, а для сортировки в порядке возрастания — ASC.

Оператор SORT BY сортирует строки перед передачей их в редуктор, поэтому порядок гарантируется внутри каждого редуктора, а не по всему результату. Сортировка всегда зависит от типа столбца.

Например, если тип столбца числовой, сортировка происходит в числовом порядке, а если тип столбца строковый, сортировка происходит в лексикографическом порядке.

На скриншоте ниже показан запрос SORT BY с использованием DESC.

Запрос SORT BY по полю employees_guru возвращает идентификатор в порядке убывания.

На приведенном выше снимке экрана мы можем наблюдать следующее:

  1. Это запрос, выполненный к таблице «employees_guru» с условием SORT BY и именем столбца, заданным в качестве SORT BY, «Id». Мы использовали ключевое слово DESC.
  2. Таким образом, отображаемый результат упорядочен по убыванию значения «Id».

Запрос:

SELECT * from employees_guru SORT BY Id DESC;

Cluster By

Оператор CLUSTER BY используется в HiveQL в качестве альтернативы операторам DISTRIBUTE BY и SORT BY.

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

Например, предложение CLUSTER BY указано в имени столбца Id таблицы employees_guru. Выполнение этого запроса передает результаты нескольким редукторам на бэкэнде, но на фронтенде оно является альтернативным предложением как для SORT BY, так и для DISTRIBUTE BY.

Это процесс обработки запросов с использованием операторов SORT BY, GROUP BY или CLUSTER BY в рамках фреймворка MapReduce. Таким образом, если мы хотим сохранить результаты в нескольких редукторах, мы используем CLUSTER BY.

Грамматика CLUSTER BY принимает только имена столбцов, поэтому к ней нельзя добавлять ASC и DESC; для получения результата в порядке убывания требуется DISTRIBUTE BY с отдельной опцией SORT BY … DESC.

На скриншоте ниже показан запрос CLUSTER BY по идентификатору Id.

Запрос CLUSTER BY по столбцу Id объекта employees_guru

Из приведенного выше снимка экрана мы получаем следующие наблюдения:

  1. Это запрос, который применяет условие CLUSTER BY к значению поля Id. В данном случае он будет сортировать значения по Id.
  2. Здесь отображаются значения Id и Name, присутствующие в базе данных employees_guru, в отсортированном порядке.

Запрос:

SELECT  Id, Name from employees_guru CLUSTER BY Id;

Распространить

Предложение DISTRIBUTE BY используется для таблиц, присутствующих в Hive. Hive использует столбцы в предложении DISTRIBUTE BY для распределения строк между редукторами, поэтому все строки, имеющие одинаковое значение столбца в предложении DISTRIBUTE BY, попадают в один и тот же редуктор.

  • Это гарантирует, что каждый из N редукторов не будет перекрываться.ping набор значений столбцов
  • Он не сортирует выходные данные каждого редуктора, и нет гарантии, что совпадающие строки будут располагаться рядом друг с другом.

На скриншоте ниже показан запрос DISTRIBUTE BY по идентификатору Id.

Запрос DISTRIBUTE BY по столбцу Id объекта employees_guru

На приведенном выше скриншоте можно заметить следующее:

  1. Предложение DISTRIBUTE BY применяется к идентификатору таблицы “employees_guru”.
  2. В выходных данных отображаются идентификатор (Id) и имя (Name). На серверной стороне строки с одинаковым идентификатором поступают в один и тот же редуктор.

Запрос:

SELECT  Id, Name from employees_guru DISTRIBUTE BY Id;

Эти четыре пункта легко перепутать, поэтому в таблице ниже приведено их сравнение.

пункт Переходники Что это гарантирует
СОРТИРОВАТЬ ПО Одна Полный порядок по всему результату
Сортировать по Много Заказ только в пределах каждого редуктора.
РАСПРОСТРАНЯТЬ ЧЕРЕЗ Много Один и тот же ключ попадает в один и тот же редуктор, но без сортировки.
КЛАСТЕР ПО Много Распределить по плюс Сортировать по, по возрастанию

Часто задаваемые вопросы (FAQ)

Для сортировки каждой строки требуется всего один редуктор, что может занять несколько часов при работе с большой таблицей. Ограничение LIMIT работает. Установка параметра hive.mapred.mode в значение nonstrict полностью снимает это ограничение.

Установите параметр mapreduce.job.reduces перед запросом, чтобы зафиксировать количество, иначе Hive будет оценивать его на основе размера входных данных. Параметр ORDER BY игнорирует эту настройку, поскольку полный заказ всегда сводится к одному редуктору.

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

Они родственны, но не идентичны. Отбор ведер Метод CLUSTER BY сохраняет строки постоянно в фиксированном количестве файлов, в то время как CLUSTER BY распределяет и сортирует строки только на время выполнения одного запроса.

Системы машинного обучения анализируют план выполнения запроса EXPLAIN и выявляют причины проблем, такие как неограниченный порядок сортировки ORDER BY, отсутствие фильтра разделов или искаженный ключ. Каждое предложение проверяется на соответствие результатам фактического выполнения.

Он хорошо формирует эти шаблоны на основе короткого комментария. Проверьте все, что специфично для движка, потому что это легко может привести к сбоям. Spark Синтаксис SQL или Presto, который Hive отклоняет, например, DESC после CLUSTER BY.

Текстовый файл с именем Employees.txt содержит значения шести столбцов и загружается в таблицу перед выполнением первого запроса. Аналогичным образом работает любой файл с разделителями и совпадающими столбцами.

Семантика идентична, поскольку это особенности языка HiveQL, а не особенности движка. Меняется только физический план — движки по-разному планируют этапы сортировки и перемешивания, поэтому время выполнения различается, а результаты остаются неизменными.

Подведем итог этой публикации следующим образом: