2014-12-09 3 views
0

Я хотел бы выполнить некоторую работу по агрегации в агрегатном столбце (после GROUP BY) в Hive с использованием Python. Я обнаружил, что для этой цели существует UDAF. Все, что я могу найти, это пример Java. Есть ли пример написания на Python?Как написать UDF Python для пользовательской функции сгенерированной функции в кусте

Или для python между UDF и UDAF, нет никакой разницы? Для UDAF мне просто нужно написать его как редуктор? Пожалуйста, порекомендуйте.

ответ

2

Вы можете использовать поточную UDF-функцию Hive (TRANSFORM), чтобы использовать UDF Python, который считывает из stdin и выводит на stdout. Вы не нашли примеров Python «UDAF», потому что UDAF относится к классу Java Hive, который вы расширяете, поэтому он будет только в Java.

При использовании потокового UDF, Hive будет выбирать, запускать ли или на карте или сокращать задание, поэтому нет необходимости указывать (подробнее об этой функции см. По этой ссылке: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Transform).

В основном, ваша реализация заключалась бы в написании скрипта python, который считывает из stdin, вычисляет некоторое число агрегатов и выводит его на stdout. Для реализации в улье сделать следующее:

1) Сначала добавьте питон скрипт в библиотеку ресурсов в улье, так что он получает распределены по кластеру:

add file script.py; 

2) Затем вызовите ваше преобразование функции и ввод столбцы, которые вы хотите скопировать. Вот пример:

select transform(input cols) 
using 'python script.py' as (output cols) 
from table 
; 

В зависимости от того, что вам нужно сделать, вам может потребоваться отдельный сценарий сопоставления и редуктора. Если вам необходимо агрегировать данные на основе значения столбца, не забудьте использовать синтаксис CLUSTER BY/DISTRIBUTE BY на вашем этапе картографа, чтобы секционированные данные отправлялись в редуктор.

Дайте мне знать, если это поможет.

+0

Я узнал, что вам нужно будет использовать JAVA для написания UDAF в Hive. – kee

Смежные вопросы