Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列通过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操做和编程接口。html
Compare:相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,通常都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据变换操做,包括在MapReduce中被忽视的链接Join操做。程序员
Pig包括两部分:编程
Pig内部,每一个操做或变换是对输入进行数据处理,而后产生输出结果,这些变换操做被转换成一系列MapReduce做业,Pig让程序员不须要知道这些转换具体是如何进行的,这样工程师能够将精力集中在数据上,而非执行的细节上。数据结构
(1)专一于于大量数据集分析;
(2)运行在集群的计算架构上,Yahoo Pig 提供了多层抽象,简化并行计算让普通用户使用;这些抽象完成自动把用户请求queries翻译成有效的并行评估计划,而后在物理集群上执行这些计划;
(3)提供相似 SQL 的操做语法;
(4)开放源代码;架构
对于开发人员,直接使用Java APIs多是乏味或容易出错的,同时也限制了Java程序员在Hadoop上编程的运用灵活性。因而Hadoop提供了两个解决方案,使得Hadoop编程变得更加容易。编程语言
•Pig是一种编程语言,它简化了Hadoop常见的工做任务。Pig可加载数据、表达转换数据以及存储最终结果。Pig内置的操做使得半结构化数据变得有意义(如日志文件)。同时Pig可扩展使用Java中添加的自定义数据类型并支持数据转换。分布式
•Hive在Hadoop中扮演数据仓库的角色。Hive添加数据的结构在HDFS,并容许使用相似于SQL语法进行数据查询。与Pig同样,Hive的核心功能是可扩展的。函数
Pig和Hive老是使人困惑的。Hive更适合于数据仓库的任务,Hive主要用于静态的结构以及须要常常分析的工做。Hive与SQL类似促使 其成为Hadoop与其余BI工具结合的理想交集。Pig赋予开发人员在大数据集领域更多的灵活性,并容许开发简洁的脚本用于转换数据流以便嵌入到较大的应用程序。Pig相比Hive相对轻量,它主要的优点是相比于直接使用Hadoop Java APIs可大幅削减代码量。正由于如此,Pig仍然是吸引大量的软件开发人员。grunt
下载pig的压缩包,这里使用的是pig-0.11.1版本,已经上传至了百度网盘中(URL:http://pan.baidu.com/s/1o6IDfhK)工具
(1)经过FTP工具上传到虚拟机中,能够选择XFtp、CuteFTP等工具
(2)解压缩
tar -zvxf pig-0.11.1.tar.gz
(3)重命名
mv pig-0.11.1 pig
(4)修改/etc/profile,增长内容以下,最后从新生效配置文件source /etc/profile
export PIG_HOME=/usr/local/pig
export PATH=.:$HADOOP_HOME/bin:$PIG_HOME/bin:$HBASE_HOME/bin:$ZOOKEEPER_HOME/bin:$JAVA_HOME/bin:$PATH
进入$PIG_HOME/conf中,编辑pig.properties文件,加入如下两行内容:
fs.default.name=hdfs://hadoop-master:9000
mapred.job.tracker=hadoop-master:9001
结合本笔记第五篇《自定义类型处理手机上网日志》的手机上网日志为背景,咱们要作的就是经过Pig Latin对该日志进行流量的统计。该日志的数据结构定义以下图所示:(该文件的下载地址为:http://pan.baidu.com/s/1dDzqHWX)
PS:在使用Pig以前先将该文件上传至HDFS中,这里上传到了/testdir/input目录中
hadoop fs -put HTTP_20130313143750.dat /testdir/input
(1)首先经过输入Pig进入grunt,而后使用Load命令将原始文件转换为Pig能够处理的模式:
grunt>A = LOAD '/testdir/input/HTTP_20130313143750.dat' AS (t0:long,
msisdn:chararray, t2:chararray, t3:chararray, t4:chararray, t5:chararray, t6:long, t7:long, t8:long, t9:long, t10:chararray);
(2)经过Pig对指令的解析,帮咱们转换成为了MapReduce任务:
(3)经过如下命令能够查看结果:
grunt>DUMP A;
(1)这里咱们须要统计的只是手机号以及四个流量数据,所以咱们经过遍历将A中的部分字段抽取出来存入B中:
grunt> B = FOREACH A GENERATE msisdn, t6, t7, t8, t9;
(2)经过如下命令能够查看结果:
grunt>DUMP B;
(1)有用信息抽取出来后,看到结果中一个手机号可能有多条记录,所以这里经过手机号进行分组:
grunt> C = GROUP B BY msisdn;
(2)经过如下命令能够查看结果:
grunt>DUMP C;
(1)在对手机号进行分组以后,咱们能够看到某个手机号对应着多条流量记录数据,所以继续使用FOREACH遍历分组数据,而后对四个流量数据进行汇总,这里使用了聚合函数SUM():
grunt> D = FOREACH C GENERATE group, SUM(B.t6), SUM(B.t7), SUM(B.t8), SUM(B.t9);
(2)经过如下命令能够查看结果:
grunt>DUMP D;
(1)在对流量统计完毕以后,结果仍然是在Pig中,这里就须要对其进行持久化操做,即将结果存储到HDFS中:
grunt> STORE D INTO '/testdir/output/wlan_result';
(2)经过HDFS Shell查看存储结果:
hadoop fs -text /testdir/output/wlan_result/part-r-*
(1)yanghuahui,《Hadoop Pig简介、安装与使用》:http://www.cnblogs.com/yanghuahui/p/3768270.html
(2)cloudsky,《Hadoop使用(六)Pig》:http://www.cnblogs.com/skyme/archive/2012/06/04/2534876.html
(3)rzhzhz,《Pig与Hive的对比》:http://blog.csdn.net/rzhzhz/article/details/7557607