Не только SQL-операторы: Transform для манипулирования данными в Apache Hive

Автор Категория , ,
Не только SQL-операторы: Transform для манипулирования данными в Apache Hive

Что такое Hive Transform, зачем это нужно дата-инженеру и разработчику распределенных приложений, где и как использовать эту функцию популярного средства SQL-on-Hadoop. Краткий обзор альтернативного способа операций с данными в Apache Hive, его возможности и ограничения, а также связь с HiveQL.

Преобразования в Apache Hive

Apache Hive – это популярная экосистема хранилища данных на основе Hadoop HDFS для выполнения пакетных и специальных запросов к большим наборам данных с использованием SQL-запросов. Apache Hive может обрабатывать петабайты данных и широко используется для приложений аналитики больших данных (OLAP). Однако, иногда некоторые варианты запросов и логику их обработки к данным сложно реализовать типовыми средствами языка SQL, который в Apache Hive называется HiveQL (HQL). Обойти это ограничение позволяет Hive Transform – по сути пользовательская функция (UDF), которая пригодится для реализации пользовательских сценариев, написанных на любом языке программирования: Python, PHP и пр., и применения этого кода для преобразования строк и столбцов, чтобы их можно было просто включить в обычный SQL-запрос.

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

  • SORT BY сортирует данные по reducer’ам для выполнения распределенных вычислений по модели MapReduce;
  • ORDER BY упорядочивает данные глобально с последующей передачей из одного reducer’а, что может стать узким местом в производительности кластерных операций;
  • DISTRIBUTE BY используется для распределения входных строк между reducer’ами, гарантируя, что все строки для одних и тех же ключевых столбцов попадают в один и тот же из них. Здесь отсутствует сортировка данных, т.е. на выходе будут несортированные неперекрывающиеся диапазоны данных.
  • CLUSTER BY – комбинация предложений DISTRIBUTE BY и SORT BY. Выход для N reducer’ов будет N различных отсортированных неперекрывающихся диапазонов данных.

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

Практический пример использования в SQL-запросе

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

SELECT TRANSFORM (in_col1,in_col2,in_col3 ....)
USING 'python custom_transform.py'
AS out_col1, out_col2, out_col3 ...
FROM
(
{any sql logic with optional distribute by/cluster by clause}
)

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

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

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

#!/usr/local/bin/python
import json
import sys
import datetimedef encrypt_fields(parameters):
    #logic to modify parameters
    return parameters
for line in sys.stdin:
    line = line.replace('\\t',' ')
    parameters = line.strip('\n').split('\t')
   
    # modify parameters according to some logic
    modified_params = encrypt_fields(parameters)
   
    # Can check some condition to filter out entire row and don't print
    if (filter condition is true):
      continue
    print ('\t'.join(modified_params))

Если бизнес-логика обработки данных зависит от порядка строк, то используются предложения DISTRIBUTE BYи SORT BY, чтобы получить данные в соответствии с нужным сценарием. Идея состоит в том, чтобы сгруппировать данные, а затем отсортировать их так, чтобы все данные, относящиеся только к ключу, собирались вместе в желаемой сортировке.

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

select user_id,timestamp, in_col3,in_col4,in_col4 ....
from user_transaction
distribute by user_id
sort by user_id, timestamp

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

Таким образом, для использования Hive Transform для различных сложных сценариев, которые трудно решить с помощью обычного SQL-запроса, необходимо выполнить 3 шага:

  • создать собственный скрипт преобразования;
  • добавить этот пользовательский файл сценария в Hive, используя команду добавления файла;
  • использовать конструкцию Hive TRANSFORM…AS в SQL-запросе.

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

При использовании Hive Transform нужно помнить о некоторых особенностях этого преобразования. В частности, необходимо очистить все столбцы STRING перед преобразованием. Если наш столбец STRING содержит табуляцию, преобразователь идентификаторов не вернет некорректный результат. Помочь в этом может оператор REGEXP_REPLACE, заменив табуляцию каким-либо другим символом на пути к вызову TRANSFORM().

Предложение TRANSFORM запрещено, если настроена авторизация на основе стандарта SQL, поддерживаемая в Hive с версии 0.13. Этот сценарий авторизации позволяет Hive быть полностью совместимым с SQL, не вызывая проблем обратной совместимости для текущих пользователей. В рамках этой модели авторизации пользователи, имеющие доступ к CLI-интерфейсу Apache Hive, командам HDFS, командной строке Pig, команде «hadoop jar» и пр., считаются привилегированными пользователями. На практике такой доступ обычно требуется только командам, работающим с рабочими нагрузками ETL-процессов. Эти инструменты не получают доступ к данным через HiveServer2, поэтому их доступ не авторизован через эту модель. Для пользователей Hive CLI, Pig и MapReduce доступ к таблицам Hive можно контролировать с помощью авторизации на основе хранилища, включенной на сервере хранилища метаданных.

Для аналитики данных чаще всего используются средства SQL и ODBC/JDBC-доступ к данным через HiveServer2, и их можно контролировать с помощью этой модели авторизации. Но ее включение делает ограничивает некоторые команды и операторы Hive, например, dfs, add, delete, compile и reset. Команды установки (set) для изменения конфигурации Hive управляются с помощью параметра конфигурации hive.security.authorization.sqlstd.confwhitelist. Если это нужно настроить, администратор HiveServer2 может установить значение для этого параметра конфигурации в файле hive-site.xml. Права на добавление или удаление функций и макросов ограничены ролью администратора. Пользователь с ролью администратора может запускать команды для создания постоянных функций, которые затем могут использовать все пользователи. Однако, при включении SQL-модели авторизации использование Hive Transform становится невозможным. Читайте в нашей следующей статье про обновление разделов в хранилище метаданных Hive с помощью команды MSCK REPAIR TABLE и ее альтернативах.

Больше практических примеров по работе с Apache Hive для эффективной аналитики больших данных вы узнаете на специализированных курсах в нашем лицензированном учебном центре обучения и повышения квалификации для разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве:

Источники

  1. https://medium.com/@agarwal.viren96/understanding-apache-hive-transforms-cf72bf8807f
  2. https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Transform
  3. https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization