除了内置函数之外, Pig还为 User (UDF:用户定义函数)提供广泛的支持。使用这些UDF,可以定义我们自己的函数并使用它们。UDF支持六种编程语言,即Java,,,,Ruby和。

对于编写UDF,在Java中提供全面的支持,并在所有其他语言中提供有限的支持。使用Java,你可以编写涉及处理的所有部分的UDF,如数据加载/存储,列转换和聚合。由于 Pig是用Java编写的,因此与其他语言相比,使用Java语言编写的UDF工作效率更高。

在 Pig中,我们还有一个用于UDF名为 的Java存储库。使用,我们可以访问由其他用户编写的Java UDF,并贡献我们自己的UDF。

Java中的UDF的类型

在使用Java编写UDF时,我们可以创建和使用以下三种类型的函数

使用Java编写UDF

要使用Java编写UDF,我们必须集成jar文件 Pig-0.15.0.jar 。在本章节中,将讨论如何使用编写示例UDF。在继续学习前,请确保你已在系统中安装了和Maven。

按照下面给出的步骤写一个UDF函数:

 
	
   4.0.0 
   Pig_Udf 
   Pig_Udf 
   0.0.1-SNAPSHOT
	
       
      src    
            
                 
            maven-compiler-plugin        
            3.3        
                      
               1.7          
               1.7        
                  
             
        
   
	
    
	
                  
         org.apache.pig            
         pig            
         0.15.0     
       
		
              
         org.apache.hadoop            
         hadoop-core            
         0.20.2     
       
      
     
	

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{ 
   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时,必须继承类并向 exec()函数提供实现。在此函数中,写入UDF所需的代码。在上面的例子中,我们返回了将给定列的内容转换为大写的代码。

使用UDF

在编写UDF和生成Jar文件后,请按照下面给出的步骤:

步骤1:注册Jar文件

在写入UDF(在Java中)后,我们必须使用运算符注册包含UDF的Jar文件。通过注册Jar文件,用户可以将UDF的位置绑定到 Pig。

语法

下面给出了运算符的语法。

REGISTER path; 

让我们注册本章前面创建的.jar。以本地模式启动 Pig并注册jar文件.jar,如下所示。

$cd PIG_HOME/bin 
$./pig –x local 
REGISTER '/$PIG_HOME/sample_udf.jar'

注意:假设路径中的Jar文件:/$/.jar

步骤2:定义别名

注册UDF后,可以使用 运算符为其定义一个别名。

语法

下面给出了运算符的语法。

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

定义的别名,如下所示。

DEFINE sample_eval sample_eval();

步骤3:使用UDF

定义别名后,可以使用与内置函数相同的UDF。假设在HDFS // 目录中有一个名为的文件,其中包含以下内容。

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 将员工的姓名转换为大写。

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

请验证关系 的内容,如下所示。

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