Для Apache Pig, как мне написать Load UDF в python

Я хочу написать функцию загрузки UDF Python для Apache Pig, чтобы я мог использовать ее в сценарии Pig следующим образом:

register 'myudfs.py' using jython as myfuncs;
A = load 'data' using myfuncs.myLoader() as line;

документация по Pig содержит некоторые сведения о написании пользовательских функций загрузки на Java, но не в Python. Мне удалось реализовать довольно полезные функции Eval с помощью Python, но я не смог найти ничего о том, как писать функции загрузки на этом языке.

Поскольку я уже реализовал несколько Eval UDF на Python, я хотел бы придерживаться этого языка для всех своих UDF.


person halloleo    schedule 19.08.2013    source источник
comment
Я только что нашел этот ответ: Согласно @Ian_Stevens, LoadFuncs for Pig не может быть написан на Python . Это объясняет, почему документация так умалчивает об этом. Но так ли это?   -  person halloleo    schedule 19.08.2013


Ответы (1)


Да, это правда. Вы даже можете посмотреть на источник, чтобы убедиться. Обратите внимание, как JythonFunction расширяет EvalFunc не LoadFunc.

Если мне нужно использовать python для загрузки файлов, я делаю что-то вроде:

register 'myudfs.py' using jython as myudfs ;

A = LOAD 'foo.bar' AS (total:chararray) ; 
B = FOREACH A GENERATE myudf.prepare_input(total) ;

Чтобы имитировать sudo-LoadFunc.

person mr2ert    schedule 20.08.2013
comment
Спасибо за Ваш ответ. Ссылка на JythonFunction делает это действительно ясным. - person halloleo; 22.08.2013
comment
К вашей работе: я пробовал точно так же. Проблема в том, что мне нужна специальная обработка для 1-й строки каждого входного файла, а глобальный счетчик строк перечисляет все строки во всех файлах, поэтому в foreach у меня нет возможности знать, нахожусь ли я на первой линии или нет. Вот почему я надеялся написать настоящий LoadFunc. - person halloleo; 22.08.2013
comment
Для этого вам понадобится Java UDF. Их довольно сложно писать, но я написал кое-что, что может быть близко к тому, что вы хотите здесь. Перечисление может быть выполнено с помощью RANK. Это то же самое, что и этот вопрос? - person mr2ert; 22.08.2013