Apache Pig - funções definidas pelo usuário

Além das funções integradas, o Apache Pig oferece amplo suporte para USer Dafinado Funções (UDF's). Usando essas UDFs, podemos definir nossas próprias funções e usá-las. O suporte UDF é fornecido em seis linguagens de programação, a saber, Java, Jython, Python, JavaScript, Ruby e Groovy.

Para escrever UDFs, é fornecido suporte completo em Java e suporte limitado em todas as linguagens restantes. Usando Java, você pode escrever UDFs envolvendo todas as partes do processamento, como carregamento / armazenamento de dados, transformação de coluna e agregação. Como o Apache Pig foi escrito em Java, os UDFs escritos usando a linguagem Java funcionam de forma eficiente em comparação com outras linguagens.

No Apache Pig, também temos um repositório Java para UDF's nomeado Piggybank. Usando o Piggybank, podemos acessar UDFs de Java escritos por outros usuários e contribuir com nossas próprias UDFs.

Tipos de UDFs em Java

Ao escrever UDFs usando Java, podemos criar e usar os três tipos de funções a seguir -

  • Filter Functions- As funções de filtro são usadas como condições em declarações de filtro. Essas funções aceitam um valor Pig como entrada e retornam um valor booleano.

  • Eval Functions- As funções Eval são usadas em instruções FOREACH-GENERATE. Essas funções aceitam um valor Pig como entrada e retornam um resultado Pig.

  • Algebraic Functions- As funções algébricas atuam em bolsas internas em uma instrução FOREACHGENERATE. Essas funções são usadas para realizar operações MapReduce completas em uma bolsa interna.

Escrevendo UDFs usando Java

Para escrever uma UDF usando Java, temos que integrar o arquivo jar Pig-0.15.0.jar. Nesta seção, discutimos como escrever uma amostra de UDF usando Eclipse. Antes de prosseguir, certifique-se de ter instalado o Eclipse e o Maven em seu sistema.

Siga as etapas abaixo para escrever uma função UDF -

  • Abra o Eclipse e crie um novo projeto (digamos myproject)

  • Converta o projeto recém-criado em um projeto Maven.

  • Copie o seguinte conteúdo no pom.xml. Este arquivo contém as dependências do Maven para arquivos jar Apache Pig e 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>
  • Salve o arquivo e atualize-o. NoMaven Dependencies seção, você pode encontrar os arquivos jar baixados.

  • Crie um novo arquivo de classe com o nome Sample_Eval e copie o seguinte conteúdo nele.

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();  
   } 
}

Ao escrever UDFs, é obrigatório herdar a classe EvalFunc e fornecer implementação para exec()função. Dentro desta função, o código necessário para o UDF é escrito. No exemplo acima, retornamos o código para converter o conteúdo da coluna fornecida em maiúsculas.

  • Depois de compilar a classe sem erros, clique com o botão direito no arquivo Sample_Eval.java. Dá a você um menu. Selecioneexport como mostrado na imagem a seguir.

  • Ao clicar export, você obterá a seguinte janela. Clique emJAR file.

  • Continue clicando em Next>botão. Você verá outra janela onde você precisa inserir o caminho no sistema de arquivos local, onde você precisa armazenar o arquivo jar.

  • Finalmente clique no Finishbotão. Na pasta especificada, um arquivo Jarsample_udf.jaré criado. Este arquivo jar contém o UDF escrito em Java.

Usando o UDF

Depois de escrever o UDF e gerar o arquivo Jar, siga as etapas abaixo -

Etapa 1: Registrando o arquivo Jar

Depois de escrever UDF (em Java), temos que registrar o arquivo Jar que contém a UDF usando o operador Register. Ao registrar o arquivo Jar, os usuários podem indicar a localização do UDF ao Apache Pig.

Syntax

A seguir está a sintaxe do operador Register.

REGISTER path;

Example

Como exemplo, vamos registrar o sample_udf.jar criado anteriormente neste capítulo.

Inicie o Apache Pig no modo local e registre o arquivo jar sample_udf.jar conforme mostrado abaixo.

$cd PIG_HOME/bin 
$./pig –x local 

REGISTER '/$PIG_HOME/sample_udf.jar'

Note - assume o arquivo Jar no caminho - /$PIG_HOME/sample_udf.jar

Etapa 2: Definindo o Alias

Depois de registrar o UDF, podemos definir um alias para ele usando o Define operador.

Syntax

A seguir está a sintaxe do operador Define.

DEFINE alias {function | [`command` [input] [output] [ship] [cache] [stderr] ] };

Example

Defina o alias para sample_eval conforme mostrado abaixo.

DEFINE sample_eval sample_eval();

Etapa 3: usando o UDF

Depois de definir o alias, você pode usar o UDF da mesma forma que as funções integradas. Suponha que haja um arquivo chamado emp_data no HDFS/Pig_Data/ diretório com o seguinte conteúdo.

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

E suponha que carregamos esse arquivo no Pig, conforme mostrado abaixo.

grunt> emp_data = LOAD 'hdfs://localhost:9000/pig_data/emp1.txt' USING PigStorage(',')
   as (id:int, name:chararray, age:int, city:chararray);

Vamos agora converter os nomes dos funcionários em maiúsculas usando o UDF sample_eval.

grunt> Upper_case = FOREACH emp_data GENERATE sample_eval(name);

Verifique o conteúdo da relação Upper_case como mostrado abaixo.

grunt> Dump Upper_case;
  
(ROBIN)
(BOB)
(MAYA)
(SARA)
(DAVID)
(MAGGY)
(ROBERT)
(SYAM)
(MARY)
(SARAN)
(STACY)
(KELLY)