Apache Pig用户定义函数

1. Apache Pig UDF简介

除了内置函数之外,Apache Pig还提供对Pig UDF的广泛支持。 基本上,我们可以使用这些UDF定义我们自己的函数并使用它们。 而且,在常用的六种编程语言中,UDF支持都可用。 比如Java,Jython,Python,JavaScript,Ruby和Groovy。

但是, Java编程语言中提供的支持最好。 在其他语言中提供了有限的支持。 另外,我们可以使用Java编写包含数据加载/存储,列转换和聚合等处理的所有部分的UDF。 由于Apache Pig是用Java编写的,因此使用Java语言编写的UDF与其他语言相比效率更高。

另外,我们在Apache Pig中,有为UDF的存储的Piggybank的Java UDF存储库。 我们可以访问由其他用户编写的Java UDF,并使用Piggybank贡献我们自己的UDF。

2. Java中的Pig UDF的类型

1542460526520244.png

我们可以在使用Java编写Pig UDF时创建和使用几种类型的函数,例如:

过滤功能 (Filter Functions)

在过滤器语句中,我们使用过滤器函数作为条件。 它接受一个Pig值作为输入并返回一个布尔值。

评估函数 (Eval Functions)

在FOREACH GENERATE语句中,我们使用Eval函数。它接受一个Pig值作为输入并返回一个Pig结果。

代数函数 (Algebraic Functions)

在FOREACH GENERATE声明中,我们使用代数函数作用于inner bag。可在inner bag上执行完整的MapReduce操作。

3.使用Java编写Pig UDF

可以用jar文件Pig-0.15.0.jar 来编写Java UDF。 正在演示如何使用Eclipse编写一个示例UDF。

编写UDF函数,请按照以下步骤操作 – 

首先,在打开Eclipse之后创建一个新项目(比如project1)。

然后将新创建的项目转换为Maven项目。

此外,请复制pom.xml中的以下内容。 这个文件包含Apache Pig和Hadoop的核心jar文件的Maven依赖关系。

1.<project xmlns = "http://maven.apache.org/POM/4.0.0"
2.xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
3.xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0http://maven.apache .org/xsd/maven-4.0.0.xsd">
4.<modelVersion>4.0.0</modelVersion>
5.<groupId>Pig_Udf</groupId>
6.<artifactId>Pig_Udf</artifactId>
7.<version>0.0.1-SNAPSHOT</version>
8.<build> 
9.<sourceDirectory>src</sourceDirectory> 
10.<plugins> 
11.<plugin> 
12.<artifactId>maven-compiler-plugin</artifactId> 
13.<version>3.3</version> 
14.<configuration> 
15.<source>1.7</source> 
16.<target>1.7</target> 
17.</configuration> 
18.</plugin> 
19.</plugins> 
20.</build>
21.<dependencies>
22.<dependency> 
23.<groupId>org.apache.pig</groupId> 
24.<artifactId>pig</artifactId> 
25.<version>0.15.0</version> 
26.</dependency>
27.<dependency> 
28.<groupId>org.apache.hadoop</groupId> 
29.<artifactId>hadoop-core</artifactId> 
30.<version>0.20.2</version> 
31.</dependency>
32.</dependencies> 
33.</project>

保存该文件并刷新。 我们可以在Maven依赖项部分找到下载的jar文件。

然后用名称Sample_Eval创建一个新的类文件。 另外,复制下面的内容:

1.import java.io.IOException;
2.import org.apache.pig.EvalFunc;
3.import org.apache.pig.data.Tuple;
4.import java.io.IOException;
5.import org.apache.pig.EvalFunc;
6.import org.apache.pig.data.Tuple;
7.public class Sample_Eval extends EvalFunc<String>{
8.public String exec(Tuple input) throws IOException { 
9.if (input == null || input.size() == 0) 
10.return null; 
11.String str = (String)input.get(0); 
12.return str.toUpperCase(); 
13.}
14.}

在编写UDF时,继承EvalFunc类并为exec()函数提供实现。 在这个函数中编写UDF所需的代码。 此外,请参阅上面的示例,必须返回代码以将给定列的内容转换为大写。

右键单击Sample_Eval.java文件,然后选择Export。

点击JAR文件,点击下一步>按钮继续。,需要在本地文件系统中输入路径。 特别是,我们需要存储jar文件的位置。

现在单击Finish按钮,我们可以看到,在指定的文件夹中创建了一个Jar文件sample_udf.jar。 该jar文件包含用Java编写的UDF。

4.如何使用Pig UDF

在编写UDF并生成Jar文件之后,按照以下步骤操作 – 

第1步:注册Jar文件

使用Register操作符,必须在编写UDF(使用Java)之后注册包含UDF的Jar文件。 此外,用户可以通过注册Jar文件来将UDF的位置提供给Apache Pig。

注册自定义函数的语法是:

1. REGISTER path;

例如,让我们注册一下上面创建的sample_udf.jar:

1.Start Apache Pig in local mode and register the jar file sample_udf.jar as shown below.
2.$cd PIG_HOME/bin
3.$./pig –x local
4.REGISTER '/$PIG_HOME/sample_udf.jar'

假设Jar文件放在 – /$PIG_HOME/sample_udf.jar

第2步:定义UDF别名

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

定义运算符的语法:

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

示例:

定义sample_eval的别名:

1.
DEFINE sample_eval sample_eval();

第3步:使用UDF

在定义别名后,可以使用UDF,与内置函数相同的用法。 假定HDFS / Pig_Data /目录中有一个名为Stu_data的文件。 内容是:

1.001,Rohit,22,new york
2.002,Sohail,23,Kolkata
3.003,Ankur,23,Tokyo
4.004,Vishal,25,London
5.005,Dheeraj,23,Bhubaneswar
6.006,Mitali,22,Chennai
7.007,Raj,22,new york
8.008,Somesh,23,Kolkata
9.009,Mehul,25,Tokyo
10.010,Shreyash,25,London
11.011,Shan,25,Bhubaneswar
12.012,Kajal,22,Chennai

将这个文件加载到Pig中:

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

使用UDF sample_eval将学生的姓名转换为大写:

1.
grunt> Upper_case = FOREACH Stu_data GENERATE sample_eval(name);

验证relation Upper_case的内容:

1.grunt> Dump Upper_case;
2.(Rohit)
3.(Sohail)
4.(Ankur)
5.(Vishal)
6.(Dheeraj)
7.(Mitali)
8.(Raj)
9.(Somesh)
10.(Mehul)
11.(Shreyash)
12.(Shan)
13.(Kajal)

5.结论

我们学习了Apache Pig用户定义函数(UDF's)的整个概念,讨论了Pig UDF的类型,用Java编写Pig UDF。 最后,我们学习了如何使用Pig UDF。

Apache Pig用户定义函数

发表评论

邮箱地址不会被公开。 必填项已用*标注

− 1 = 三

滚动到顶部