您现在的位置 >> Hadoop教程 >> Hadoop实战 >> 专题  
 

PIG实战

【作者:Hadoop实战专家】【关键词:数据类型 数据 加载 文件 使用 】 【点击:15336次】【2014-01-1】
dump命令将打印出这个变量的内容,store命令将变量所代表的内容保存到一个文件中。4.7 Working with UDF(user defined function)pig能够支持两种类型的UDFs:eval和load/store,其中load/store的自定义函数主要是用来加载和保存特定的数据格式;(STUDENT4)  

相关热门搜索:hive数据类型 hive 数据类型

大数据标签:hadoop mapreduce bigdata

1. pig简介
2. 安装pig
3. 实战pig
4. 深入pig
5. 参考资料及代码下载
<1>. Pig简介 pig是hadoop项目的一个拓展项目,用以简化hadoop编程(简化的程度超乎想象啊),并且提供一个更高层次抽象的数据处理能力,同时能够保持hadoop的简单和可靠性。
<2>. 安装pig 2.1
2.2 解压下载完成的pig安装包:
xuqiang@ubuntu:~/hadoop/src/pig$tar zxvf pig-0.8.1.tar.gz

2.3 设置环境变量
xuqiang@ubuntu:~$ vim.bashrc

exportPATH=~/hadoop/src/pig/pig-0.8.1/bin/:$PATH

exportPIG_HOME=~/hadoop/src/pig/pig-0.8.1/

exportHADOOP_CONF_DIR=~/hadoop/src/hadoop-0.21.0/conf

exportPIG_CLASSPATH=~/hadoop/src/hadoop-0.21.0/conf

这里需要说明的是pig是能够运行在两种模式下:local模式和mapreduce模式,变量HADOOP_CONF_DIR主要是为了在mapreduce模式下使用。
为了使新设置的环境变量生效,使用如下命令:

xuqiang@ubuntu:~$source .bash_profile

测试一下pig的安装是否正确:
xuqiang@ubuntu:~$ pig-x local

2011-06-0517:48:49,480 [main] INFO org.apache.pig.Main - Logging error messages to:/home/xuqiang/pig_1307321329471.log

2011-06-0517:48:49,926 [main] INFOorg.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting tohadoop file system at: file:///

grunt>
此时表明pig已经正确安装。
<3>. Pig实战 在pig下载的安装包,解压完成了之后,有一个tutorial目录,我们使用里面的数据来开始pig学习。如果tutorial目录下没有存在pigtutorial.tar.gz文件的话,那么需要使用ant来编译出这个文件:
xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1$ant

这时ant将会下载依赖的jar的文件,同时将编译出对应版本的pig jar文件。然后进入tutorial目录,执行ant命令:
xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1$cd tutorial/

xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1/tutorial$ant

这时将生成pigtutorial.tar.gz文件,解压该文件形成pigtmp的文件夹。该文件夹结构:
.

|--excite-small.log

|--excite.log.bz2

|--pig.jar

|--script1-hadoop.pig

|--script1-local.pig

|--script2-hadoop.pig

|--script2-local.pig

`--tutorial.jar

1directory, 9 files
我们下面将主要分析excite-small.log文件,该文件的数据结构如下:
UserID TimeStampSearchQuery
我们首先将excite-small.log加载到一个变量(也称之为alias)中,我们将使用该变量来表示这个数据集:
grunt> log = load'excite-small.log' as (user, time, query);

注意的是这时pig并没有运行该命令,仅仅是解析了该命令,只有到使用dump命令或者是store命令时pig才会真正执行该命令。dump命令将打印出这个变量的内容,store命令将变量所代表的内容保存到一个文件中。
这时如果想要查看该log的结构:
grunt> describe log;

log:{user: bytearray,time: bytearray,query: bytearray}
这是如果我们想要查看该log文件的前4行的话:
grunt> lmt = limitlog 4;

grunt>dump lmt;
这时将打印出log文件的前四行数据。
<4>. 深入pig 4.1 Utility and file commands

1.png (355.01 KB, 下载次数: 0)

  

2013-12-22 16:47 上传

4.2 Data read/write operators

2.PNG (41.59 KB, 下载次数: 0)

  

2013-12-22 16:48 上传

4.3 Diagnostic operators诊断操作

3.PNG (48.32 KB, 下载次数: 0)

  

2013-12-22 16:49 上传

4.4 Data type and schemespig中有6个基本数据类型和3个复合数据类型,基本数据类型如下:

4.PNG (9.71 KB, 下载次数: 0)

  

2013-12-22 16:49 上传

复合数据类型:

5.PNG (28.34 KB, 下载次数: 0)

  

2013-12-22 16:49 上传

pig
中数据模型中能够允许数据类型的嵌套,类似于xml/json格式。
4.5 Expression and functionspig能够支持常见运算符。

6.PNG (37.42 KB, 下载次数: 0)

  

2013-12-22 16:50 上传

同时在pig中提供了一些内建函数。

7.PNG (39.5 KB, 下载次数: 0)

  

2013-12-22 16:50 上传

这里我们没有给出示例,将在下面给出示例。
4.6 Retional operators首先编写两个数据文件A:
0,1,2

1,3,4
数据文件B:
0,5,2

1,7,8

运行pig:
xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1/tutorial/pigtmp$pig -x local

2011-06-05 18:46:54,039 [main] INFOorg.apache.pig.Main - Logging error messages to:/home/xuqiang/hadoop/src/pig/pig-0.8.1/tutorial/pigtmp/pig_1307324814030.log

2011-06-05 18:46:54,324 [main] INFOorg.apache.pig.backend.hadoop.executionengine.HExecutionEngine - Connecting tohadoop file system at: file:///

grunt>
加载数据A:
grunt> a = load 'A' using PigStorage(',') as (a1:int,a2:int, a3:int);

加载数据B:
grunt> b = load 'B' using PigStorage(',') as (b1:int,b2:int, b3:int);

求a,b的并集:
grunt> c = union a, b;
grunt> dump c;
(0,5,2)

(1,7,8)

(0,1,2)

(1,3,4)
将c分割为d和e,其中d的第一列数据值为0,e的第一列的数据为1($0表示数据集的第一列):
grunt> split c into d if $0 == 0, e if $0 == 1;

查看d:
grunt> dump d;
(0,1,2)

(0,5,2)

查看e:
(1,3,4)

(1,7,8)
选择c中的一部分数据:

grunt> f = filter c by $1 > 3;

查看数据f:
grunt> dump f;

(0,5,2)

(1,7,8)

对数据进行分组:

grunt> g = group c by $2;
查看g:
grunt> dump g;
(2,{(0,1,2),(0,5,2)})

(4,{(1,3,4)})

(8,{(1,7,8)})

当然也能够将所有的元素集合到一起:
grunt> h = group c all;

grunt> dump h;
(all,{(0,1,2),(1,3,4),(0,5,2),(1,7,8)})

查看h中元素个数:
grunt> i = foreach h generate COUNT($1);

查看元素个数:
grunt> dump i;
这里可能出现Could not resolve counter using imported: [,org.apache.pig.built in., org.apache.pig.impl.builtin.]的情况,这是需要使用register命令来注册pig对应的jar版本。
接下俩试一下jon操作:

grunt> j = join a by $2, b by $2;

该操作类似于sql中的连表查询,这是的条件是$2 == $2。
取出c的第二列$1和$1* $2,将这两列保存在k中:
grunt> k = foreach c generate $1, $1 * $2;

查看k的内容:
grunt> dump k;
(5,10)

(7,56)

(1,2)

(3,12)
4.7 Working with UDF(user defined function)pig能够支持两种类型的UDFs:eval和load/store,其中load/store的自定义函数主要是用来加载和保存特定的数据格式;eval自定义函数主要用来进行常规的数据转换。
1. eval
如果想要实现自定义的eval类型的函数,那么基本的做法是首先编写一个类继承自EvalFunc这个抽象类,同时需要重写这个类的一方法:
abstract public T exec(Tuple input) throws IOException;
该方法传入的类型是Tuple类型。
如果调用udf时使用的是:udf(ARG1, ARG2);那么调用input.get(0)将得到ARG1,同理input.get(1)得到的是ARG2,input.getSize()得到传递的参数的数量,这里就是2.
下面我们就开始编写udf UPPER.java,将UPPER.java文件保存到myudfs目录下:

packagemyudfs;
importjava.io.IOException;
importorg.apache.pig.EvalFunc;
importorg.apache.pig.data.Tuple;
importorg.apache.pig.impl.util.WrappedIOException;

publicclassUPPERextendsEvalFunc
{
publicStringexec(Tupleinput)throwsIOException{
if(input==null||input.size()==0)
returnnull;
try{
Stringstr=(String)input.get(0);
returnstr.toUpperCase();
}catch(Exceptione){
throwWrappedIOException.wrap("Caughtexceptionprocessinginputrow",e);
}
}

}
编译该文件,同时生成该jar文件:

xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1/myudfs$javac -cp ../pig.jar UPPER.java
xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1/myudfs$cd ..

xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1$jar -cf myudfs.jar myudfs

准备student_data文件:

student1,1,1
studetn2,2,2
student3,3,3
student4,4,4
在pig中测试该udf:
xuqiang@ubuntu:~/hadoop/src/pig/pig-0.8.1$pig -x local
注册该udf:

grunt> register myudfs.jar
加载数据:

grunt> A = load 'student_data' usingPigStorage(',') as (name:chararray, age:int,gpa:double);

grunt> B = FOREACH A GENERATEmyudfs.UPPER(name);

grunt> dump B;

这时将输出:

(STUDENT1)
(STUDETN2)
(STUDENT3)
(STUDENT4)

大数据系列相关文章:

最新评论
跳舞的八戒2014-09-10 10:09:22
不是广告!各位码神,顺丰速运集团总部正在招揽各方大数据方向的研发大神,有需要的跟小生联系,欢迎来骚扰
guafei2014-09-09 10:51:07
[图片]
小美2014-09-09 07:40:37
有用啊
雅希2014-09-09 12:52:03
没有加这个配置:bind-address ,我看监听的是0.0.0.0 的3306
宝福2014-09-08 02:41:37
storm-kafka呢
 
  • Hadoop生态系统资料推荐