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)