Apache Pig UDF: Часть 1 - Функции Eval, Aggregate и Filter



В этом сообщении описывается Apache Pig UDF - Eval, Aggregate & Filter Functions. Взгляните на функции Eval, Aggregate и Filter.

Apache Pig обеспечивает расширенную поддержку пользовательских функций (UDF) как способ указать пользовательскую обработку. UDF Pig в настоящее время могут выполняться на трех языках: Java, Python, JavaScript и Ruby. Наиболее обширная поддержка предоставляется для функций Java.





Пользовательские функции Java можно вызывать несколькими способами. Простейший UDF может просто расширять EvalFunc, для чего требуется только реализация функции exec. Это должно быть реализовано в каждом Eval UDF. Кроме того, если функция является алгебраической, она может реализовать алгебраический интерфейс для значительного повышения производительности запросов.

стек и куча памяти в java

Важность UDF в Pig:

Pig позволяет пользователям комбинировать существующие операторы со своим или чужим кодом через UDF. Преимущество Pig заключается в том, что он позволяет пользователям комбинировать его операторы с собственным или чужим кодом через UDF. До версии 0.7 все UDF должны быть написаны на Java и реализованы как классы Java. Это упрощает добавление новых UDF в Pig путем написания класса Java и информирования Pig о файле JAR.



Сама Pig поставляется с некоторыми UDF. До версии 0.8 это был очень ограниченный набор только стандартных агрегатных функций SQL и некоторых других. В версии 0.8 было добавлено большое количество стандартных UDF для обработки строк, математических операций и сложных функций.

Что такое копилка?

Piggybank - это набор пользовательских файлов UDF, выпущенный вместе с Pig. UDF Piggybank не включены в Pig JAR, поэтому вам придется вручную регистрировать их в своем скрипте. Вы также можете написать свои собственные UDF или использовать те, которые написаны другими пользователями.

Оценочные функции

Класс UDF расширяет класс EvalFunc, который является базовым для всех функций Eval. Все оценочные функции расширяют Java-класс org.apache.pig.EvalFunc. «Он параметризован типом возвращаемого значения UDF, которым в данном случае является строка Java. Основной метод в этом классе - «exec». Первая строка кода указывает, что функция является частью пакета myudfs.



Он берет одну запись и возвращает один результат, который будет вызываться для каждой записи, проходящей через конвейер выполнения. Требуется кортеж, содержащий все поля, которые скрипт передает в ваш UDF в качестве входных данных. Затем он возвращает тип, которым вы параметризовали EvalFunc.

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

разница между хеш-картой и хеш-таблицей
package myudfs import java.io.IOException import org.apache.pig.EvalFunc import org.apache.pig.data.Tuple открытый класс UPPER расширяет EvalFunc {public String exec (ввод кортежа) выдает исключение IOException {if (input == null || input.size () == 0) return null try {String str = (String) input.get (0) return str.toUpperCase ()} catch (Exception e) {throw new IOException ('Перехваченная входная строка обработки исключения', д)}}}

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

Агрегатные функции - еще один распространенный тип Eval-функции. Агрегатные функции обычно применяются к сгруппированным данным. Функция Aggregate берет пакет и возвращает скалярное значение. Интересной и ценной особенностью многих агрегатных функций является то, что их можно вычислять постепенно, распределенным образом. В мире Hadoop это означает, что частичные вычисления могут выполняться с помощью Map и Combiner, а конечный результат может быть вычислен с помощью Reducer.

Очень важно убедиться, что алгебраические агрегатные функции реализованы как таковые. Примеры этого типа включают встроенные COUNT, MIN, MAX и AVERAGE.

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

настройка hadoop на ubuntu
public class COUNT extends EvalFunc реализует алгебраический {public Long exec (ввод кортежа) выдает исключение IOException {return count (input)} public String getInitial () {return Initial.class.getName ()} public String getIntermed () {return Intermed.class. getName ()} public String getFinal () {return Final.class.getName ()} статический открытый класс Initial extends EvalFunc {public Tuple exec (ввод кортежа) выдает исключение IOException {return TupleFactory.getInstance (). newTuple (count (ввод)) }} статический открытый класс Intermed расширяет EvalFunc {public Tuple exec (ввод кортежа) выдает исключение IOException {return TupleFactory.getInstance (). newTuple (sum (input))}} статический открытый класс Final extends EvalFunc {public Tuple exec (ввод кортежа) выдает IOException {return sum (input)}} static protected Long count (Tuple input) выдает ExecException {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () else if (values instanceof Map) return new Long (((Map) values) .size ())} статическая защищенная длинная сумма (Tuple i nput) выбрасывает ExecException, NumberFormatException {DataBag values ​​= (DataBag) input.get (0) long sum = 0 for (Iterator (Tuple) it = values.iterator () it.hasNext ()) {Tuple t = it.next ( ) sum + = (Long) t.get (0)} return sum}}

COUNT реализует алгебраический интерфейс, который выглядит следующим образом:

открытый интерфейс Алгебраический {public String getInitial () public String getIntermed () public String getFinal ()}

Чтобы функция была алгебраической, она должна реализовать алгебраический интерфейс, который состоит из определения трех классов, производных от EvalFunc. Контракт заключается в том, что функция exec класса Initial вызывается один раз и передается в исходный входной кортеж. Его вывод представляет собой кортеж, содержащий частичные результаты. Функция exec класса Intermed может вызываться ноль или более раз и принимает в качестве входных данных кортеж, который содержит частичные результаты, полученные классом Initial или предыдущими вызовами класса Intermed, и создает кортеж с другим частичным результатом. Наконец, вызывается функция exec класса Final, которая дает окончательный результат в виде скалярного типа.

Функции фильтра:

Функции фильтра - это функции Eval, возвращающие логическое значение. Его можно использовать везде, где подходит логическое выражение, включая оператор FILTER или выражение Bincond. Apache Pig не поддерживает логические значения полностью, поэтому функции фильтрации не могут отображаться в таких операторах, как «Foreach», результаты которых передаются другому оператору. Однако в операторах фильтра можно использовать функции фильтра.

В приведенном ниже примере реализована функция IsEmpty:

import java.io.IOException import java.util.Map import org.apache.pig.FilterFunc import org.apache.pig.PigException import org.apache.pig.backend.executionengine.ExecException import org.apache.pig.data.DataBag import org.apache.pig.data.Tuple import org.apache.pig.data.DataType / ** * Определяет, пуста ли сумка или карта. * / public class IsEmpty extends FilterFunc {@Override public Boolean exec (ввод кортежа) выдает исключение IOException {try {Object values ​​= input.get (0) if (values ​​instanceof DataBag) return ((DataBag) values) .size () == 0 else if (values ​​instanceof Map) возвращают ((Map) values) .size () == 0 else {int errCode = 2102 String msg = 'Невозможно проверить' + DataType.findTypeName (values) + 'на пустоту.' throw new ExecException (msg, errCode, PigException.BUG)}} catch (ExecException ee) {throw ee}}}