Pig系列的学习文档,希望对大家有用,感谢关注散仙!
Apache Pig的前世今生
Apache Pig如何自定义UDF函数?
Apache Pig5行代码怎么实现Hadoop的WordCount?
Apache Pig入门学习文档(一)
Apache Pig学习笔记(二)
Apache Pig学习笔记之内置函数(三)
玩转大数据系列之Apache Pig如何与Apache Lucene集成(一)
玩转大数据系列之Apache Pig如何与Apache Solr集成(二)
玩转大数据系列之Apache Pig如何与MySQL集成(三)
玩转大数据系列之如何给Apache Pig自定义存储形式(四)
玩转大数据系列之Apache Pig如何通过自定义UDF查询数据库(五)
如何使用Pig集成分词器来统计新闻词频?
在Hadoop的生态系统中,如果我们要离线的分析海量的数据,大多数人都会选择Apache Hive或Apache Pig,在国内总体来说,Hive使用的人群占比比较高, 而Pig使用的人相对来说,则少的多,这并不是因为Pig不成熟,不稳定,而是因为Hive提供了类数据库SQL的查询语句,使得大多人上手Hive非常容易,相反而Pig则提供了类Linux shell的脚本语法,这使得大多数人不喜欢使用。
如果在编程界,统计一下会SQL和会shell,那个人数占的比重大,散仙觉得,毫无疑问肯定是SQL语句了。因为有相当一部分编程人员是不使用Linux的,而是微软的的一套从C#,到ASP.NET,SQL Server再到Windows的专用服务器 。
OK,扯远了,赶紧回来,使用shell的攻城师们,我觉得都会爱上它的,因为在linux系统中,没有比shell更简洁易用了,如果再配上awk和sed更是如虎添翼了。
我们都知道shell是支持函数调用的,这一点和JavaScript是非常类似的,通过定义函数我们可以重复使用某个功能,而不用再次大量编码,其中,把变的东西,分离成参数,不变的东西定义成语句,这样以来,就能够降低编码的冗余和复杂性,试想一下,如果Java里,没有方法,那将会是多么不可思议的一件事。
Pig作为类shell的语言,也支持了函数的方式,封装某个功能,以便于我们重用,这一点相比Hive来说,是一个很好的优势。
下面先看下定义Pig函数(也叫宏命令)定义的语法:
DEFINE (macros) :
支持的参数:
alias pig的标量引用
整形(integer)
浮点型(float)
字符串(String)
下面看几个例子,让我们迅速对它熟悉并掌握,先看下我们的测试数据:
- 1,张三,男,23,中国
- 2,张三,女,32,法国
- 3,小花,男,20,英国
- 4,小红,男,16,中国
- 5,小红,女,25,洛阳
- 6,李静,女,25,中国河南安阳
- 7,王强,男,11,英国
- 8,张飞,男,20,美国
1,张三,男,23,中国 2,张三,女,32,法国 3,小花,男,20,英国 4,小红,男,16,中国 5,小红,女,25,洛阳 6,李静,女,25,中国河南安阳 7,王强,男,11,英国 8,张飞,男,20,美国
再看下pig脚本:
- --定义pig函数1 支持分组统计数量
- DEFINE group_and_count (A,group_key,number_reduces) RETURNS B {
- d = group $A by $group_key parallel $number_reduces;
- $B = foreach d generate group, COUNT($1);
- };
- --定义pig函数2 支持排序
- --A 关系引用标量
- --order_field 排序的字段
- --order_type 排序方式 desc ? asc ?
- --storedir 存储的HDFS路径
- --空返回值
- define my_order(A,order_field,order_type,storedir) returns void {
- d = order $A by $order_field $order_type ;
- store d into '$storedir' ;
- };
- --定义pig函数3,支持filter过滤,以及宏命令里面调用
- --定义过滤操作
- define myfilter (A,field,count) returns B{
- b= filter $A by $field > $count ;
- $B = group_and_count(b,'sex',1);
- };
- a = load '/tmp/dongliang/318/person' using PigStorage(',') AS (id:int,name:chararray,sex:chararray,age:int,address:chararray) ;
- --------pig函数1测试-----------------
- --定义按名字分组
- --bb = group_and_count(a,name,1);
- --定义按性别分组
- --cc = group_and_count(a,sex,1);
- --dump bb;
- --dump cc;
- -------pig函数2测试------------------
- --按年龄降序
- --my_order(a,age,'desc','/tmp/dongliang/318/z');
- --dump a;
- -------pig函数3测试------------------
- --过滤年龄大于20的,并按性别,分组统计数量
- r = myfilter(a,'age',20);
- dump r;
--定义pig函数1 支持分组统计数量 DEFINE group_and_count (A,group_key,number_reduces) RETURNS B { d = group $A by $group_key parallel $number_reduces; $B = foreach d generate group, COUNT($1); }; --定义pig函数2 支持排序 --A 关系引用标量 --order_field 排序的字段 --order_type 排序方式 desc ? asc ? --storedir 存储的HDFS路径 --空返回值 define my_order(A,order_field,order_type,storedir) returns void { d = order $A by $order_field $order_type ; store d into '$storedir' ; }; --定义pig函数3,支持filter过滤,以及宏命令里面调用 --定义过滤操作 define myfilter (A,field,count) returns B{ b= filter $A by $field > $count ; $B = group_and_count(b,'sex',1); }; a = load '/tmp/dongliang/318/person' using PigStorage(',') AS (id:int,name:chararray,sex:chararray,age:int,address:chararray) ; --------pig函数1测试----------------- --定义按名字分组 --bb = group_and_count(a,name,1); --定义按性别分组 --cc = group_and_count(a,sex,1); --dump bb; --dump cc; -------pig函数2测试------------------ --按年龄降序 --my_order(a,age,'desc','/tmp/dongliang/318/z'); --dump a; -------pig函数3测试------------------ --过滤年龄大于20的,并按性别,分组统计数量 r = myfilter(a,'age',20); dump r;
在上面的脚本中,散仙定义了三个函数,
(1)分组统计数量
(2)自定义输出存储
(3)自定义过滤并结合(1)统计数量
通过这3个例子,让大家对pig函数有一个初步的认识,上面的函数和代码都在一个脚本中,这样看起来不太友好,而且重用性,还没有得到最大发挥,实际上函数和主体脚本是可以分离的,再用的时候,我们只需要导入函数脚本,即可拥有所有的函数功能,这样一来,函数脚本被分离到主脚本外面,就大大增加了函数脚本的重用性,我们也可以再其他脚本中引用,而且函数脚本中也可以再次引用其他的函数脚本,但前提是不能够,递归引用,这样Pig语法在执行时,是会报错的,下面看下分离后的脚本文件:
一:函数脚本文件
- --定义pig函数1 支持分组统计数量
- --A 关系引用标量
- --group_key 分组字段
- --使用reduce的个数
- --返回最终的引用结果
- DEFINE group_and_count (A,group_key,number_reduces) RETURNS B {
- d = group $A by $group_key parallel $number_reduces;
- $B = foreach d generate group, COUNT($1);
- };
- --定义pig函数2 支持排序
- --A 关系引用标量
- --order_field 排序的字段
- --order_type 排序方式 desc ? asc ?
- --storedir 存储的HDFS路径
- --空返回值
- define my_order(A,order_field,order_type,storedir) returns void {
- d = order $A by $order_field $order_type ;
- store d into '$storedir' ;
- };
- --定义pig函数3,支持filter过滤,以及宏命令里面调用
- --A 关系引用标量
- --field 过滤的字段
- --count 阈值
- --返回最终的引用结果
- define myfilter (A,field,count) returns B{
- b= filter $A by $field > $count ;
- $B = group_and_count(b,'sex',1);
- };
- [search@dnode1 pigmacros]$
--定义pig函数1 支持分组统计数量 --A 关系引用标量 --group_key 分组字段 --使用reduce的个数 --返回最终的引用结果 DEFINE group_and_count (A,group_key,number_reduces) RETURNS B { d = group $A by $group_key parallel $number_reduces; $B = foreach d generate group, COUNT($1); }; --定义pig函数2 支持排序 --A 关系引用标量 --order_field 排序的字段 --order_type 排序方式 desc ? asc ? --storedir 存储的HDFS路径 --空返回值 define my_order(A,order_field,order_type,storedir) returns void { d = order $A by $order_field $order_type ; store d into '$storedir' ; }; --定义pig函数3,支持filter过滤,以及宏命令里面调用 --A 关系引用标量 --field 过滤的字段 --count 阈值 --返回最终的引用结果 define myfilter (A,field,count) returns B{ b= filter $A by $field > $count ; $B = group_and_count(b,'sex',1); }; [search@dnode1 pigmacros]$
二,主体脚本文件
- --导入pig公用的函数库
- import 'function.pig' ;
- a = load '/tmp/dongliang/318/person' using PigStorage(',') AS (id:int,name:chararray,sex:chararray,age:int,address:chararray) ;
- --------pig函数1测试-----------------
- --定义按名字分组
- --bb = group_and_count(a,name,1);
- --定义按性别分组
- --cc = group_and_count(a,sex,1);
- --dump bb;
- --dump cc;
- -------pig函数2测试------------------
- --按年龄降序
- --my_order(a,age,'desc','/tmp/dongliang/318/z');
- --dump a;
- -------pig函数3测试------------------
- --过滤年龄大于20的,并按性别,分组统计数量
- r = myfilter(a,'age',20);
- dump r;
--导入pig公用的函数库 import 'function.pig' ; a = load '/tmp/dongliang/318/person' using PigStorage(',') AS (id:int,name:chararray,sex:chararray,age:int,address:chararray) ; --------pig函数1测试----------------- --定义按名字分组 --bb = group_and_count(a,name,1); --定义按性别分组 --cc = group_and_count(a,sex,1); --dump bb; --dump cc; -------pig函数2测试------------------ --按年龄降序 --my_order(a,age,'desc','/tmp/dongliang/318/z'); --dump a; -------pig函数3测试------------------ --过滤年龄大于20的,并按性别,分组统计数量 r = myfilter(a,'age',20); dump r;
需要注意的是,导入的函数文件,需要用单引号引起来,这样我们就完成了pig函数的重用,是不是非常类似shell的语法呢?
相关推荐
** Pig 概述 ** Pig 是 Apache Hadoop 生态系统中的一个高级数据处理语言,它简化了在大...通过不断学习和理解 Pig Latin 语法以及如何在 Cloudera 环境下有效地使用它,数据分析师和工程师可以更高效地处理海量数据。
1. **Pig Latin 语言**:Pig Latin 是 Pig 的核心,它是一种声明式语言,用户可以定义一系列的操作来转换数据,而无需关注底层的 MapReduce 实现。例如,`LOAD` 命令用于从 HDFS 加载数据,`FILTER` 用于筛选数据,`...
6. **examples** 目录:包含Pig Latin示例脚本,供学习和测试用途。 在实际使用中,用户首先需要在Linux服务器上安装Hadoop环境,然后解压并配置Pig 0.12.1,使其能够与Hadoop集群通信。接着,可以使用Pig命令行或...
在"azkaban学习文档"中,我们可以深入理解以下几个核心知识点: 1. **Azkaban架构**:Azkaban由三个主要部分组成——Web Server、Executor Server和Job Runner。Web Server提供了用户界面和管理接口,Executor ...
Pig Latin将复杂的数据处理任务转化为一系列的MapReduce作业,简化了大数据处理流程。 5. **ZooKeeper**:ZooKeeper是一个分布式协调服务,用于管理大型分布式系统的配置信息、命名、提供分布式同步和组服务。在...
Hadoop并非孤立存在,它周围有一系列相关项目,如HBase(分布式数据库)、Hive(数据仓库工具)、Pig(数据流处理语言)、Spark(快速通用的大数据处理引擎)等,这些工具共同构建了一个强大的大数据处理生态系统。...
"d2l-zh-1.0.zip_D2L 文件_d2lzh安装_deeplearning_mxnet_pig17v" 是该教程的一个版本,它包含了一系列用于学习和实践的代码,主要基于MXNet框架。MXNet是一个高效的深度学习库,支持多种编程语言,如Python,便于...
本文档通过一个具体示例来展示Pig在Web规模数据挖掘中的应用。 #### Pig 概览 Pig是一种高级的数据流语言,具备以下特点: - **SQL-like语法**:支持类似SQL的操作,如选择(select)、连接(join)、分组(group),这...
Pig Latin的脚本通常涉及从文件系统读取数据,对数据进行一系列转换操作,然后将结果写回文件系统。这种模式在清单1所示的简单示例中得到了体现,它演示了如何使用Pig Latin查找日志文件中的警告记录。 在Pig Latin...
### easyBPM表单设计器新增日期时间组件操作文档知识点 ...通过本文档的学习,开发者应该能够掌握如何在easyBPM表单设计器中新增一个日期时间组件,并能够通过技术讨论渠道获取必要的帮助和支持。
- 其他相关项目,如Hive(数据仓库工具)、Pig(数据分析工具)、HBase(NoSQL数据库)、Spark(快速大数据处理框架)等,它们如何与Hadoop协同工作。 7. **案例研究**: - 实际场景下的Hadoop应用,例如搜索引擎...
### Hadoop与HBase系列配置知识点 #### 一、Hadoop概述 Hadoop是一个由Apache基金会维护的开源软件框架,其主要目标是为了实现可靠、可扩展的分布式计算环境。通过简单编程模型支持大规模数据集在计算机集群上的...
4. **Hadoop生态**:Hadoop不仅仅是HDFS和MapReduce,还包括一系列相关的工具和项目,如HBase(分布式NoSQL数据库)、Hive(基于Hadoop的数据仓库工具)、Pig(数据流处理平台)、Oozie(工作流调度系统)、...
Apache Hive 是一个基于 Hadoop 的数据...官方文档详细介绍了Hive的架构、功能、查询语言以及最佳实践,是学习和使用Hive不可或缺的参考资料。对于想要深入理解和掌握大数据处理的开发者来说,这份文档是宝贵的财富。
这个压缩包文件包含的是Hadoop2.7.1的中文文档,对于学习和理解Hadoop的运作机制、配置以及使用方法有着极大的帮助。 Hadoop的核心由两个主要组件组成:HDFS(Hadoop Distributed File System)和MapReduce。HDFS是...
Pig Latin是由一系列操作(称为“Operators”)组成的,这些操作可以组合成复杂的数据流图,用于对Hadoop上的大规模数据进行处理。常见的Pig Latin操作包括LOAD、FILTER、JOIN、GROUP BY等。 在编写Pig脚本时,错误...
6. **Hadoop生态系统**:Hadoop不仅仅是MapReduce和HDFS,还包括一系列相关的项目,如Hive(SQL-like查询工具)、Pig(数据分析平台)、HBase(分布式NoSQL数据库)、Spark(更快的计算框架)等,它们共同构建了强大...
通过这些官方文档的学习,读者可以深入理解Hadoop及其相关组件的工作原理,掌握大数据开发和分析的实践技能,并为获得CCA认证做好准备。学习过程中,不仅要注意理论知识,还要多做实践,以便更好地将理论应用于实际...
总的来说,学习大数据开发需要掌握一系列的技术和工具,包括但不限于Hadoop、Spark、NoSQL数据库、数据处理框架、机器学习库以及数据可视化工具。通过理论学习与实践操作相结合,你将能够在这个充满挑战和机遇的...
在本学习资源包中,你将找到一系列的学习视频,它们会逐步引导你了解并掌握大数据的核心技术。这些技术包括: 1. **Hadoop**:Hadoop是Apache基金会开发的开源框架,用于处理和存储大规模数据。其中,HDFS(Hadoop ...