Что такое 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} )
Предположим, пользовательский скрипт преобразования зависит только от одной конкретной строки. В таких случаях предложение распределения/сортировки не требуется. Это пригодится в следующих сценариях:
- зашифровать некоторые/все столбцы строки в соответствии с некоторой логикой;
- получить несколько новых полей или измените/удалите старые столбцы строки в соответствии с некоторой логикой;
- фильтрация/игнорирование всей строки из вывода;
- создание совершенно новых строк из существующих строк и их вывод.
Код курса
HIVE
Ближайшая дата курса
Продолжительность
ак.часов
Стоимость обучения
0 руб.
К примеру, нужно зашифровать некоторые столбцы, используя пользовательскую функцию шифрования 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-запросе.
Код курса
NOSQL
Ближайшая дата курса
Продолжительность
ак.часов
Стоимость обучения
0 руб.
Особенности и ограничения
При использовании 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 в Москве:
Источники