Hadoop学习笔记—16.Pig框架学习

一、关于Pig:别以为猪不能干活

1.1 Pig的简介

  Pig是一个基于Hadoop的大规模数据分析平台,它提供的SQL-LIKE语言叫Pig Latin,该语言的编译器会把类SQL的数据分析请求转换为一系列经过优化处理的MapReduce运算。Pig为复杂的海量数据并行计算提供了一个简单的操作和编程接口。

Compare:相比Java的MapReduce API,Pig为大型数据集的处理提供了更高层次的抽象,与MapReduce相比,Pig提供了更丰富的数据结构,一般都是多值和嵌套的数据结构。Pig还提供了一套更强大的数据变换操作,包括在MapReduce中被忽视的连接Join操作。

  Pig包括两部分:

  • 用于描述数据流的语言,称为Pig Latin。
  • 用于执行Pig Latin程序的执行环境,当前有两个环境:单JVM中的本地执行环境和Hadoop集群上的分布式执行环境。

  Pig内部,每个操作或变换是对输入进行数据处理,然后产生输出结果,这些变换操作被转换成一系列MapReduce作业,Pig让程序员不需要知道这些转换具体是如何进行的,这样工程师可以将精力集中在数据上,而非执行的细节上。

1.2 Pig的特点

   (1)专注于于大量数据集分析;
     (2)运行在集群的计算架构上,Yahoo Pig 提供了多层抽象,简化并行计算让普通用户使用;这些抽象完成自动把用户请求queries翻译成有效的并行评估计划,然后在物理集群上执行这些计划;
     (3)提供类似 SQL 的操作语法;
     (4)开放源代码;

1.3 Pig与Hive的区别

  对于开发人员,直接使用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仍然是吸引大量的软件开发人员。

二、Pig的安装配置

2.1 准备工作

  下载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

2.2 设置Pig与Hadoop关联

  进入$PIG_HOME/conf中,编辑pig.properties文件,加入以下两行内容:

fs.default.name=hdfs://hadoop-master:9000

mapred.job.tracker=hadoop-master:9001

三、Pig的使用实例

3.1 文件背景

  结合本笔记第五篇《自定义类型处理手机上网日志》的手机上网日志为背景,我们要做的就是通过Pig Latin对该日志进行流量的统计。该日志的数据结构定义如下图所示:(该文件的下载地址为:http://pan.baidu.com/s/1dDzqHWX

  PS:在使用Pig之前先将该文件上传至HDFS中,这里上传到了/testdir/input目录中

hadoop fs -put HTTP_20130313143750.dat /testdir/input

3.2 Load:把HDFS中的数据转换为Pig可以处理的模式

  (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;

3.3 FOREACH:把A中有用的字段抽取出来

  (1)这里我们需要统计的只是手机号以及四个流量数据,因此我们通过遍历将A中的部分字段抽取出来存入B中:

grunt> B = FOREACH A GENERATE msisdn, t6, t7, t8, t9;

  (2)通过以下命令可以查看结果:

grunt>DUMP B;

  

3.4 GROUP:分组数据

  (1)有用信息抽取出来后,看到结果中一个手机号可能有多条记录,因此这里通过手机号进行分组:

grunt> C = GROUP B BY msisdn;

  (2)通过以下命令可以查看结果:

grunt>DUMP C;

3.5 GENERATE:流量汇总

  (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;

  

3.6 STORE:将统计结果存储到HDFS中进行持久化

  (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

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

时间: 2024-10-10 09:26:51

Hadoop学习笔记—16.Pig框架学习的相关文章

Hadoop学习笔记—18.Sqoop框架学习

一.Sqoop基础:连接关系型数据库与Hadoop的桥梁 1.1 Sqoop的基本概念 Hadoop正成为企业用于大数据分析的最热门选择,但想将你的数据移植过去并不容易.Apache Sqoop正在加紧帮助客户将重要数据从数据库移到Hadoop.随着Hadoop和关系型数据库之间的数据移动渐渐变成一个标准的流程,云管理员们能够利用Sqoop的并行批量数据加载能力来简化这一流程,降低编写自定义数据加载脚本的需求. Apache Sqoop(SQL-to-Hadoop) 项目旨在协助 RDBMS 与

Hadoop学习笔记—15.HBase框架学习(基础知识篇)

HBase是Apache Hadoop的数据库,能够对大型数据提供随机.实时的读写访问.HBase的目标是存储并处理大型的数据.HBase是一个开源的,分布式的,多版本的,面向列的存储模型,它存储的是松散型数据. 一.HBase:BigTable的开源实现 1.1 HBase出现的背景 (1)随着数据规模越来越大,大量业务场景开始考虑数据存储水平扩展,使得存储服务可以增加/删除,而目前的关系型数据库更专注于一台机器. (2)海量数据量存储成为瓶颈,单台机器无法负载大量数据. (3)单台机器IO读

Hadoop学习笔记—19.Flume框架学习

START:Flume是Cloudera提供的一个高可用的.高可靠的开源分布式海量日志收集系统,日志数据可以经过Flume流向需要存储终端目的地.这里的日志是一个统称,泛指文件.操作记录等许多数据. 一.Flume基础理论 1.1 常见的分布式日志收集系统 Scribe是facebook开源的日志收集系统,在facebook内部已经得到大量的应用. Chukwa 是一个开源的用于监控大型分布式系统的数据收集系统.这是构建在 hadoop 的 hdfs 和 map/reduce 框架之上的,继承了

Hadoop学习笔记—17.Hive框架学习

一.Hive:一个牛逼的数据仓库 1.1 神马是Hive? Hive 是建立在 Hadoop 基础上的数据仓库基础构架.它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储.查询和分析存储在 Hadoop 中的大规模数据的机制.Hive 定义了简单的类 SQL  查询语言,称为 QL ,它允许熟悉 SQL  的用户查询数据.同时,这个语言也允许熟悉 MapReduce 开发者的开发自定义的 mapper  和 reducer 来处理内建的 mapper 和 reduce

Hadoop学习笔记—15.HBase框架学习(基础实践篇)

一.HBase的安装配置 1.1 伪分布模式安装 伪分布模式安装即在一台计算机上部署HBase的各个角色,HMaster.HRegionServer以及ZooKeeper都在一台计算机上来模拟. 首先,准备好HBase的安装包,我这里使用的是HBase-0.94.7的版本,已经上传至百度网盘之中(URL:http://pan.baidu.com/s/1pJ3HTY7) (1)通过FTP将hbase的安装包拷贝到虚拟机hadoop-master中,并执行一系列操作:解压缩.重命名.设置环境变量 ①

Android 学习笔记之AndBase框架学习(五) 数据库ORM..注解,数据库对象映射...

PS:好久没写博客了... 学习内容: 1.DAO介绍,通用DAO的简单调度过程.. 2.数据库映射关系... 3.使用泛型+反射+注解封装通用DAO.. 4.使用AndBase框架实现对DAO的调用实现数据库基本操作.. 1.DAO..   DAO..这个说法大家都不陌生..数据库操作访问对象的抽象接口层..在DAO内部封装好通用的方法..然后再使用一个具体类来进行实现..在我们想要调用这些方法对数据库进行相关操作时..只需要传递数据实体对象,就可以通过实体对象的传递从而实现对数据库进行操作.

Android 学习笔记之AndBase框架学习(三) 使用封装好的函数完成Http请求..

PS:踏踏实实走好每一步... 学习内容: 1.使用AndBase框架实现无参Http Get请求... 2.使用AndBase框架实现有参Http Post请求... 3.使用AndBase框架实现有参Http Get请求...   AndBase框架为我们提供了一些相关的方法提供给我们使用,用来完成Http网络请求...总体就是对Http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用Volley框架..楼主对比了两个框架中的源码...Volley更多的地方是使用抽象方法封装在接口

Android 学习笔记之AndBase框架学习(七) SlidingMenu滑动菜单的实现

PS:努力的往前飞..再累也无所谓.. 学习内容: 1.使用SlidingMenu实现滑动菜单..   SlidingMenu滑动菜单..滑动菜单在绝大多数app中也是存在的..非常的实用..Github有位牛人将这个东西书写成了一个简单的框架..我们只需要通过引用相关的资源就能够完成一个滑动菜单的实现..有了这一层的基础..那么滑动菜单就很容易实现了..就拿我们最为熟悉的QQ来说吧..当我们进行滑动操作的时候..会有一个新的View去覆盖原本的View..我们可以通过触发新的视图上的控件来执行

Android 学习笔记之AndBase框架学习(一) 实现多功能标题栏

PS:Volley框架终于通过看源码的方式完成了所有的学习..开始学习AndBase...AndBase的源码实在是多的离谱...因此就不对所有的源码进行分析了... 学习内容: 1.使用AndBase实现多功能标题栏...   AndBase框架内部提供了许多的方式能够使我们去设置一个更好的标题栏,进行动态的改变,而并非静态的将标题栏界面写死...能够使得标题栏更加的美观...总体就是动态的获取布局然后通过对布局的操作来自定义一个良好的标题栏...   使用AndBase框架的时候我们的主函数