Apache Pig - определяемые пользователем функции
Помимо встроенных функций, Apache Pig предоставляет обширную поддержку для Uсер Dопределен Fобъединения (UDF). Используя эти UDF, мы можем определять наши собственные функции и использовать их. Поддержка UDF предоставляется на шести языках программирования, а именно Java, Jython, Python, JavaScript, Ruby и Groovy.
Для написания UDF полная поддержка предоставляется на Java, а ограниченная поддержка предоставляется на всех остальных языках. Используя Java, вы можете писать UDF, включающие все части обработки, такие как загрузка / сохранение данных, преобразование столбцов и агрегирование. Поскольку Apache Pig был написан на Java, UDF, написанные с использованием языка Java, работают более эффективно по сравнению с другими языками.
В Apache Pig у нас также есть репозиторий Java для UDF с именем Piggybank. Используя Piggybank, мы можем получить доступ к Java UDF, написанному другими пользователями, и добавить наши собственные UDF.
Типы UDF в Java
При написании UDF с использованием Java мы можем создавать и использовать следующие три типа функций:
Filter Functions- Функции фильтра используются как условия в операторах фильтра. Эти функции принимают на вход значение Pig и возвращают логическое значение.
Eval Functions- Функции Eval используются в операторах FOREACH-GENERATE. Эти функции принимают значение Pig в качестве входных данных и возвращают результат Pig.
Algebraic Functions- Алгебраические функции действуют на внутренние пакеты в операторе FOREACHGENERATE. Эти функции используются для выполнения полных операций MapReduce с внутренним пакетом.
Написание UDF с использованием Java
Чтобы написать UDF с использованием Java, мы должны интегрировать файл jar Pig-0.15.0.jar. В этом разделе мы обсудим, как написать образец UDF с помощью Eclipse. Прежде чем продолжить, убедитесь, что в вашей системе установлены Eclipse и Maven.
Следуйте инструкциям ниже, чтобы написать функцию UDF -
Откройте Eclipse и создайте новый проект (скажем myproject).
Преобразуйте вновь созданный проект в проект Maven.
Скопируйте следующий контент в pom.xml. Этот файл содержит зависимости Maven для файлов jar Apache Pig и Hadoop-core.
<project xmlns = "http://maven.apache.org/POM/4.0.0"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0http://maven.apache .org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>Pig_Udf</groupId>
<artifactId>Pig_Udf</artifactId>
<version>0.0.1-SNAPSHOT</version>
<build>
<sourceDirectory>src</sourceDirectory>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.apache.pig</groupId>
<artifactId>pig</artifactId>
<version>0.15.0</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-core</artifactId>
<version>0.20.2</version>
</dependency>
</dependencies>
</project>
Сохраните файл и обновите его. вMaven Dependencies раздел, вы можете найти загруженные файлы jar.
Создайте новый файл класса с именем Sample_Eval и скопируйте в него следующий контент.
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
import java.io.IOException;
import org.apache.pig.EvalFunc;
import org.apache.pig.data.Tuple;
public class Sample_Eval extends EvalFunc<String>{
public String exec(Tuple input) throws IOException {
if (input == null || input.size() == 0)
return null;
String str = (String)input.get(0);
return str.toUpperCase();
}
}
При написании UDF обязательно унаследовать класс EvalFunc и предоставить реализацию для exec()функция. В этой функции написан код, необходимый для UDF. В приведенном выше примере мы вернули код для преобразования содержимого данного столбца в верхний регистр.
После компиляции класса без ошибок щелкните правой кнопкой мыши файл Sample_Eval.java. Он дает вам меню. Выбратьexport как показано на следующем снимке экрана.
При нажатии export, вы получите следующее окно. Нажмите наJAR file.
Продолжите, нажав Next>кнопка. Вы получите другое окно, в котором вам нужно ввести путь в локальной файловой системе, где вам нужно сохранить файл jar.
Наконец нажмите кнопку Finishкнопка. В указанной папке файл Jarsample_udf.jarсоздано. Этот файл jar содержит UDF, написанный на Java.
Использование UDF
После написания UDF и создания файла Jar выполните следующие действия:
Шаг 1: Регистрация файла Jar
После написания UDF (на Java) мы должны зарегистрировать файл Jar, содержащий UDF, с помощью оператора Register. Регистрируя Jar-файл, пользователи могут сообщить Apache Pig местоположение UDF.
Syntax
Ниже приводится синтаксис оператора Register.
REGISTER path;
Example
В качестве примера давайте зарегистрируем файл sample_udf.jar, созданный ранее в этой главе.
Запустите Apache Pig в локальном режиме и зарегистрируйте файл jar sample_udf.jar, как показано ниже.
$cd PIG_HOME/bin
$./pig –x local
REGISTER '/$PIG_HOME/sample_udf.jar'
Note - предположим, что файл Jar находится по пути - /$PIG_HOME/sample_udf.jar
Шаг 2: определение псевдонима
После регистрации UDF мы можем определить псевдоним для него, используя Define оператор.
Syntax
Ниже приведен синтаксис оператора Define.
DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };
Example
Определите псевдоним для sample_eval, как показано ниже.
DEFINE sample_eval sample_eval();
Шаг 3: Использование UDF
После определения псевдонима вы можете использовать UDF так же, как встроенные функции. Предположим, есть файл с именем emp_data в HDFS/Pig_Data/ каталог со следующим содержанием.
001,Robin,22,newyork
002,BOB,23,Kolkata
003,Maya,23,Tokyo
004,Sara,25,London
005,David,23,Bhuwaneshwar
006,Maggy,22,Chennai
007,Robert,22,newyork
008,Syam,23,Kolkata
009,Mary,25,Tokyo
010,Saran,25,London
011,Stacy,25,Bhuwaneshwar
012,Kelly,22,Chennai
Предположим, мы загрузили этот файл в Pig, как показано ниже.
grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
as (id:int, name:chararray, age:int, city:chararray);
Давайте теперь преобразуем имена сотрудников в верхний регистр с помощью UDF sample_eval.
grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);
Проверить содержимое отношения Upper_case как показано ниже.
grunt> Dump Upper_case;
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)