14.6 Pig实例

下面我们将结合第14.2.3节所介绍的Pig运行模式给出相应的例子。这里我们给出一个学生表(学号,姓名,性别,年龄,所在系),其中含有如下几条记录:


201000101:李勇:男:20:计算机软件与理论

201000102:王丽:女:19:计算机软件与理论

201000103:刘花:女:18:计算机应用技术

201000104:李肖:男:19:计算机系统结构

201000105:吴达:男:19:计算机系统结构

201000106:滑可:男:19:计算机系统结构


它们所对应的数据类型如下所示:


Student(Sno:chararray, Sname:chararray, Ssex:chararray, Sage:int, Sdept:chararray)


这里字段与字段之间通过冒号(半角英文标点)隔开,下面我们将在不同的运行方式下取出各个学生的姓名和年龄两个字段。


李勇 20

王丽 19

刘花 18

李肖 19

吴达 19

滑可 19


14.6.1 Local模式

这一节我们将结合上面给出的实例,具体讲解如何在Pig的Local模式下对数据进行操作。同时,我们对Pig在Local模式下的三种运行方式都进行详细的介绍。

1.Grunt Shell

通过14.3.3一节中对Pig的数据模式的介绍,我们可以了解到,记录是域的有序集合。因此,在我们对数据进行操作之前,需要按照文件中数据相应的字段和类型来加载数据。通过下面的这一条命令,我们可以把前面给出的例子按照对应字段和对应数据类型进行加载:


grunt>>A=load'/path/Student'using PigStorage(':')as(Sno:chararray, Sname:chararray,

Ssex:chararray, Sage:int, Sdept:chararray);


通过Foreach命令,从A中选出Student相应的字段,并存储到B中:


grunt>>B=foreach A generate Sname, Sage;


通过dump命令,将B中的内容输出到屏幕上:


grunt>>dump B;


下面一步将B的内容输出到本地文件中:


grunt>>store B into'/path/grunt.out';


现在我们可以打开grunt.out文件来查看操作的结果,如下所示:


李勇 20

王丽 19

刘花 18

李肖 19

吴达 19

滑可 19


2.脚本文件

脚本文件实质上是pig命令的批处理文件。

我们给出的script.pig文件包含以下内容:


A=load'/path/Student'using PigStorage(':')as(Sno:chararray, Sname:chararray,

Ssex:chararray, Sage:int, Sdept:chararray);

B=foreach A generate Sname, Sage;

dump B;

store B into'/path/tst.out';


可以看出,这个文件其实就是上面Grunt shell下命令的一个集合。

我们通过下面的命令调用这个脚本文件,可以看到,生成的结果是完全相同的。

3.嵌入式程序

用户可以方便地使用Java语言来书写相应的Pig脚本,如代码清单14-2所示。

代码清单14-2 Local模式下用Java编写的Pig脚本


package cn.edu.ruc.cloudcomputing.book.chapter14;

import java.io.IOException;

import org.apache.pig.PigServer;

public class tst_local{

public static void main(String[]args){

try{

PigServer pigServer=new PigServer("local");

runIdQuery(pigServer,"/path/Student");//调用函数

}

catch(Exception e){}

}

public static void runIdQuery(PigServer pigServer, String inputFile)throws

IOException{

pigServer.registerQuery("A=load'"+inputFile+"'using PigStorage(':')as

(Sno:chararray, Sname:chararray, Ssex:chararray, Sage:int, Sdept:chararray);");

pigServer.registerQuery("B=foreach A generate Sname, Sage;");

pigServer.store("B","/path/tstJavaLocal.out");

}

}


下面我们将通过14.2.3节中所介绍的在嵌入式方式下运行pig脚本的命令来对此文件进行编译、运行。

首先,使用下面命令对此Java源文件进行编译:


$javac-cp pig-..*-core.jar local.java


当编译完成后,通过下面命令运行“.class”类文件:


$java-cp pig-..*-core.jar:.local


然后打开生成的结果文件“tstJavaLocal.out”,我们会发现它和前面两种方式生成的结果是完全相同的。