14.4.2 使用用户定义函数
下面是我们所编写的pig脚本,它使用我们所编写的用户定义函数对上面给出的学生表进行了相应的操作。
1—myscript.pig
2 REGISTER myudfs.jar;
3 A=LOAD'Student'using PigStorage(':')as(Sno:chararray, Sname:chararray, Ssex
:chararray, Sage:int, Sdept:chararray);
4 B=FOREACH A GENERATE myudfs.UPPER(Ssex);
5 DUMP B;
我们使用下面的命令执行此脚本文件。其中,使用“-x mapreduce”指定函数运行的模式,如果用户只是为了对函数进行测试,建议用户在local模式下运行。因为对于小文件来说,MapReduce模式的准备时间显得过长,有时候甚至让用户觉得MapReduce模式下文件的运行效率比local模式下还要低。为了验证函数的通用性,这里我们使用MapReduce模式。
java-cp pig.jar org.apache.pig.Main-x mapreduce myscript.pig
这个脚本的第2行提供了JAR文件的位置,这个JAR文件中包含我们刚刚编写的用户定义函数(注意:jar文件上没有引号)。为了找到JAR文件的位置,Pig首先检查classpath环境变量。如果在classpath环境变量中不能找到JAR文件,Pig将假定地址为绝对地址或一个相对于Pig被调用位置的地址。如果JAR文件仍旧不能被发现,系统将返回一个错误。
多个用户定义函数可以被用在相同的脚本中。如果完全相同且合格的函数出现在多个JAR中,那么根据Java语义,第一个出现的函数将被一直使用。
UDF的名称和包名必须要完全合格,否则系统将返回一个错误:
java.io.IOException:Cannot instantiate:UPPER.
另外,函数的名称区分大小写(比如:UPPER和upper是不同的),UDF也可以包含一个或更多的参数。
当操作完成之后,我们可以在终端上看到Pig输出的正确结果:
BOY
GIRL
GIRL
BOY
BOY
BOY
用户定义函数还包括很多其他的内容,限于篇幅,我们在这里只做简单介绍。