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

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

Давайте сначала посмотрим на цели.

Цели

По завершении этого урока вы сможете:

  • Повысьте производительность запросов с помощью концепций разделения файлов данных в hive
  • Определить язык запросов HIVE или HIVEQL
  • Опишите способы расширения HIVEQL

Давайте посмотрим на хранение данных в одной распределенной файловой системе Hadoop.

Хранение данных в единой распределенной файловой системе Hadoop

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

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

  • Используя функцию разделения HIVE, которая разделяет данные, пользователи HIVE могут идентифицировать столбцы, которые могут использоваться для организации данных.
  • Используя секционирование, анализ может выполняться только на соответствующем подмножестве данных, что приводит к значительному повышению производительности запросов HIVE.

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

На следующей схеме поясняется хранение данных в одной распределенной файловой системе Hadoop или в каталоге HDFS.

Начнем с примера несекционированной таблицы.

Пример неразмеченной таблицы

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

В приведенном ниже примере вы можете увидеть, что в HIVE создан столбец Состояние.

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

Помните, что вы можете выполнять те же запросы и в Impala.

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

Пример многораздельной таблицы

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

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

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

Во время создания таблицы разделы определяются с помощью предложения PARTITIONED BY со списком определений столбцов для разделения. Столбец раздела - это «виртуальный столбец, в котором данные фактически не хранятся в файле.

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

Динамическое и статическое разбиение на разделы в улье

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

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

Статическое разбиение на разделы в Hive

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

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

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

Давайте теперь посмотрим на динамическое разбиение в Hive.

Динамическое разбиение на разделы в Hive

Благодаря динамическому разбиению на разделы в улье разделы создаются автоматически во время загрузки. Новые разделы можно создавать динамически из существующих данных.

Разделы создаются автоматически на основе значения последнего столбца. Если раздел еще не существует, он будет создан.

Если раздел действительно существует, он будет перезаписан ключевым словом OVERWRITE, как показано в примере ниже.

Как вы видите в примере, раздел перезаписывается. Если в таблице хранится большой объем данных, тогда подходит динамический раздел.

Обратите внимание, что по умолчанию динамическое разбиение на разделы в HIVE отключено, чтобы предотвратить случайное создание разделов.

Включите следующие параметры, чтобы использовать динамическое разбиение на разделы:

УСТАНОВИТЬ hive.exec.dynamic.partition = true;

SET hive.exec.dynamic.partition.mode = nonstrict ;.

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

Просмотр и удаление разделов

Вы можете просмотреть разделы многораздельной таблицы с помощью команды SHOW, как показано на изображении.

Чтобы удалить перетаскивание разделов, используйте команду ALTER, как показано на изображении.

Используя команду ALTER, вы также можете добавлять или изменять разделы.

Когда использовать разбиение на разделы?

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

  • Чтение всего набора данных занимает слишком много времени.
  • Запросы почти всегда фильтруются по столбцам раздела.
  • Для столбцов раздела существует разумное количество различных значений.

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

  • Избегайте разделения на столбцы, в которых слишком много уникальных строк.
  • Будьте осторожны при создании динамического раздела, так как это может привести к большому количеству разделов.
  • Попробуйте ограничить раздел менее 20 КБ.

Давайте теперь разберемся, что такое ведра в HIVE.

Ковш в улье

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

Именно здесь на помощь приходит концепция сегментирования. Группирование - это метод оптимизации, подобный разделению. Вы можете использовать ведение, если вам нужно выполнять запросы к столбцам с огромными данными, что затрудняет создание разделов. Методика оптимизации Bucketing в Hive может быть показана на следующей диаграмме.

Что делают ковши?

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

Вот синтаксис для создания таблицы сегментов.

СОЗДАТЬ ТАБЛИЦУ page_views (user_id INT, session_id BIGINT, url

НИТЬ)

РАЗДЕЛЕНА ПО (день INT)

Сгруппировано по (user_id) В 100;

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

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

Обзор языка запросов Hive Это вторая тема урока.

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

Язык запросов Hive - Введение

Это похожий на SQL язык запросов HIVE для обработки и анализа структурированных данных в Metastore. Ниже приведен пример запроса HIVEQL.

ВЫБРАТЬ

dt,

COUNT (DISTINCT (user_id))

ИЗ событий

ГРУППА ПО dt;

Важный принцип HIVEQL - расширяемость.

HIVEQL можно расширить несколькими способами:

  • Подключаемые пользовательские функции
  • Подключаемые скрипты MapReduce
  • Подключаемые пользовательские типы
  • Подключаемые форматы данных

Вы узнаете больше о пользовательских функциях и скриптах MapReduce в следующих разделах. Пользовательские типы и форматы данных выходят за рамки урока.

Пользовательская функция (UDF)

У HIVE есть способность определять функцию.

  • UDF предоставляют способ расширения функциональности HIVE с помощью функции, написанной на Java, которая может быть оценена в операторах HIVEQL. Все UFD расширяют класс HIVE UDF.
  • Подкласс UDF должен реализовать один или несколько методов с именем Assessment, которые будут вызываться HIVE. Метод Evaluate никогда не должен быть недействительным. Однако при необходимости он может вернуть значение null.

Hive UDF, пример 1

Чтобы преобразовать любое значение в градусы Цельсия:

Hive UDF, пример 2

Чтобы преобразовать любую строку в хэш-код:

Здесь хэш-код - это число, сгенерированное из любого объекта. Это позволяет быстро сохранять / извлекать объекты в хеш-таблице.

Hive UDF, пример 3

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

Теперь давайте разберемся с кодом для расширения пользовательской функции.

Код для расширения UDF

Вот код, который вы можете использовать для расширения пользовательской функции.

пакет com.example.hive.udf;

импортировать org.apache.hadoop.hive.ql.exec.UDF;

import org.apache.hadoop.io.Text;

public final class Lower extends UDF {

общедоступный текст оценки (окончательный текст) {

if (s == null) {вернуть null; }

вернуть новый текст (s.toString (). toLowerCase ());

}

}

Коды функций, определяемые пользователем

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

СОЗДАТЬ ФУНКЦИЮ my_lower как «com.example.hive.udf.Lower»;

После запуска HIVE вы можете использовать вновь определенную функцию в операторе запроса после их регистрации. Это код для использования функции в операторе запроса HIVE.

ВЫБРАТЬ my_lower (заголовок), сумма (частота) ИЗ заголовков GROUP BY my_lower (заголовок);

Написание функций на JavaScript создает свой собственный UDF. HIVE также предоставляет некоторые встроенные функции, которые можно использовать для предотвращения создания собственных UDF.

Давайте посмотрим, что это за встроенные функции.

Встроенные функции Hive

Написание функций в сценариях JAVA создает собственный UDF. Hive также предоставляет некоторые встроенные

функции, которые можно использовать для предотвращения создания собственных UDF.

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

  • Математический: для математических операций вы можете использовать примеры круглого, напольного и т. Д.
  • Коллекция: для коллекций вы можете использовать размер, ключи карты и т. Д.
  • Преобразование типов: для преобразования типов данных можно использовать приведение типов.
  • Дата: для дат используйте следующие API-интерфейсы, например год, дату и т. Д.
  • Условный: для условных функций используйте if, case и coalesce.
  • Строка: для строковых файлов используйте длину, реверс и т. Д.

Давайте посмотрим на некоторые другие функции в HIVE, такие как агрегатная функция и функция создания таблиц.

Агрегатные функции

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

Поэтому HIVE предоставляет множество встроенных определяемых пользователем агрегатных функций или UDAF.

Функции создания таблиц

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

Рассмотрим базовую таблицу pageAds. Он содержит два столбца: pageid, который представляет собой имя страницы, и список подчеркивания adid, который представляет собой массив объявлений, появляющихся на странице.

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

Скрипт SQL в боковой проекции:

ВЫБЕРИТЕ pageid, adid ИЗ pageAds

Боковой вид взорвать (adid_list) adTable

AS adid;

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

Давайте взглянем на скрипты MapReduce, которые помогают расширить HIVEQL.

Скрипты MapReduce

Скрипты MapReduce написаны на таких языках программирования, как Python. Пользователи могут подключать свои собственные настраиваемые преобразователи и редукторы в поток данных.

Для запуска настраиваемого сценария сопоставления и сценария редуктора пользователь может ввести команду, которая использует предложение TRANSFORM для встраивания сценариев сопоставителя и редуктора.

Посмотрите на сценарий, показанный ниже.

Пример: my_append.py

ВЫБЕРИТЕ ПРЕОБРАЗОВАНИЕ (foo, bar) ИСПОЛЬЗУЯ «python ./my_append.py» ИЗ образца;

Для строки в sys.stdin:

линия = line.strip ()

ключ = line.split (‘\ t’) [0]

значение = line.split (‘\ t’) [1]

клавиша печати + str (i) + ’\ t’ + value + str (i)

i=i+1

Здесь пары ключ-значение будут преобразованы в STRING и разделены TAB перед передачей в пользовательский скрипт по умолчанию.

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

Давайте сравним определяемые пользователем и определяемые пользователем агрегатные функции со скриптами MapReduce.

UDF / UADF против скриптов MapReduce

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

Атрибут

UDF / UDAF

Скрипты MapReduce

Язык

Ява

Любой язык

1/1 ввода / вывода

Поддерживается через UDF

Поддерживается

n / 1 вход / выход

Поддерживается через UDAF

Поддерживается

1 / n ввода / вывода

Поддерживается через UDTF

Поддерживается

Скорость

Быстрее (в том же процессе)

Медленнее (порождает новый процесс)

Вам также следует подумать о прохождении курса Сертификация Hadoop для больших данных здесь.

Резюме

Теперь давайте подведем итог тому, что мы узнали на этом уроке.

  • Разделы на самом деле представляют собой горизонтальные срезы данных, которые позволяют разделить большие наборы данных на более управляемые фрагменты.
  • В режиме статического разбиения вы можете вставлять или вводить файлы данных по отдельности в таблицу разделов.
  • Если в таблице хранится большой объем данных, тогда подходит динамический раздел.
  • Используйте команду SHOW для просмотра разделов.
  • Чтобы удалить или добавить разделы, используйте команду ALTER.
  • Используйте секционирование, если чтение всего набора данных занимает слишком много времени, запросы почти всегда фильтруются по столбцам секционирования, а для столбцов секционирования существует разумное количество различных значений.
  • HIVEQL - это язык запросов для HIVE для обработки и анализа структурированных данных в хранилище метаданных.
  • HIVEQL можно расширить с помощью пользовательских функций, скриптов MapReduce, пользовательских типов и форматов данных.

Вывод

На этом завершается урок «Расширенная концепция Hive и разбиение файлов данных».