原创不易,转载请务必注明,原创地址,谢谢配合!
http://qindongliang.iteye.com/



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. 1,张三,男,23,中国
  2. 2,张三,女,32,法国
  3. 3,小花,男,20,英国
  4. 4,小红,男,16,中国
  5. 5,小红,女,25,洛阳
  6. 6,李静,女,25,中国河南安阳
  7. 7,王强,男,11,英国
  8. 8,张飞,男,20,美国
1,张三,男,23,中国
2,张三,女,32,法国
3,小花,男,20,英国
4,小红,男,16,中国
5,小红,女,25,洛阳
6,李静,女,25,中国河南安阳
7,王强,男,11,英国
8,张飞,男,20,美国

再看下pig脚本:

  1. --定义pig函数1 支持分组统计数量
  2. DEFINE group_and_count (A,group_key,number_reduces) RETURNS B {
  3. d = group $A by $group_key parallel $number_reduces;
  4. $B = foreach d generate group, COUNT($1);
  5. };
  6. --定义pig函数2 支持排序
  7. --A 关系引用标量
  8. --order_field 排序的字段
  9. --order_type 排序方式 desc ? asc ?
  10. --storedir 存储的HDFS路径
  11. --空返回值
  12. define my_order(A,order_field,order_type,storedir) returns void {
  13. d = order $A by $order_field $order_type ;
  14. store  d into '$storedir' ;
  15. };
  16. --定义pig函数3,支持filter过滤,以及宏命令里面调用
  17. --定义过滤操作
  18. define  myfilter (A,field,count) returns B{
  19. b= filter $A by $field > $count ;
  20. $B = group_and_count(b,'sex',1);
  21. };
  22. a = load  '/tmp/dongliang/318/person' using PigStorage(',') AS (id:int,name:chararray,sex:chararray,age:int,address:chararray) ;
  23. --------pig函数1测试-----------------
  24. --定义按名字分组
  25. --bb = group_and_count(a,name,1);
  26. --定义按性别分组
  27. --cc = group_and_count(a,sex,1);
  28. --dump bb;
  29. --dump cc;
  30. -------pig函数2测试------------------
  31. --按年龄降序
  32. --my_order(a,age,'desc','/tmp/dongliang/318/z');
  33. --dump a;
  34. -------pig函数3测试------------------
  35. --过滤年龄大于20的,并按性别,分组统计数量
  36. r =  myfilter(a,'age',20);
  37. 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语法在执行时,是会报错的,下面看下分离后的脚本文件:

一:函数脚本文件

  1. --定义pig函数1 支持分组统计数量
  2. --A 关系引用标量
  3. --group_key 分组字段
  4. --使用reduce的个数
  5. --返回最终的引用结果
  6. DEFINE group_and_count (A,group_key,number_reduces) RETURNS B {
  7. d = group $A by $group_key parallel $number_reduces;
  8. $B = foreach d generate group, COUNT($1);
  9. };
  10. --定义pig函数2 支持排序
  11. --A 关系引用标量
  12. --order_field 排序的字段
  13. --order_type 排序方式 desc ? asc ?
  14. --storedir 存储的HDFS路径
  15. --空返回值
  16. define my_order(A,order_field,order_type,storedir) returns void {
  17. d = order $A by $order_field $order_type ;
  18. store  d into '$storedir' ;
  19. };
  20. --定义pig函数3,支持filter过滤,以及宏命令里面调用
  21. --A 关系引用标量
  22. --field 过滤的字段
  23. --count 阈值
  24. --返回最终的引用结果
  25. define  myfilter (A,field,count) returns B{
  26. b= filter $A by $field > $count ;
  27. $B = group_and_count(b,'sex',1);
  28. };
  29. [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]$


二,主体脚本文件

  1. --导入pig公用的函数库
  2. import 'function.pig' ;
  3. a = load  '/tmp/dongliang/318/person' using PigStorage(',') AS (id:int,name:chararray,sex:chararray,age:int,address:chararray) ;
  4. --------pig函数1测试-----------------
  5. --定义按名字分组
  6. --bb = group_and_count(a,name,1);
  7. --定义按性别分组
  8. --cc = group_and_count(a,sex,1);
  9. --dump bb;
  10. --dump cc;
  11. -------pig函数2测试------------------
  12. --按年龄降序
  13. --my_order(a,age,'desc','/tmp/dongliang/318/z');
  14. --dump a;
  15. -------pig函数3测试------------------
  16. --过滤年龄大于20的,并按性别,分组统计数量
  17. r =  myfilter(a,'age',20);
  18. 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的语法呢?有兴趣的同学们,赶紧体验一把吧!  

玩转大数据系列之Apache Pig高级技能之函数编程(六)的更多相关文章

  1. 玩转大数据系列之Apache Pig如何与Apache Solr集成(二)

    散仙,在上篇文章中介绍了,如何使用Apache Pig与Lucene集成,还不知道的道友们,可以先看下上篇,熟悉下具体的流程. 在与Lucene集成过程中,我们发现最终还要把生成的Lucene索引,拷 ...

  2. 【大数据系列】apache hive 官方文档翻译

    GettingStarted 开始 Created by Confluence Administrator, last modified by Lefty Leverenz on Jun 15, 20 ...

  3. 大数据系列(2)——Hadoop集群坏境CentOS安装

    前言 前面我们主要分析了搭建Hadoop集群所需要准备的内容和一些提前规划好的项,本篇我们主要来分析如何安装CentOS操作系统,以及一些基础的设置,闲言少叙,我们进入本篇的正题. 技术准备 VMwa ...

  4. 大数据系列之并行计算引擎Spark介绍

    相关博文:大数据系列之并行计算引擎Spark部署及应用 Spark: Apache Spark 是专为大规模数据处理而设计的快速通用的计算引擎. Spark是UC Berkeley AMP lab ( ...

  5. 大数据系列之Flume+kafka 整合

    相关文章: 大数据系列之Kafka安装 大数据系列之Flume--几种不同的Sources 大数据系列之Flume+HDFS 关于Flume 的 一些核心概念: 组件名称     功能介绍 Agent ...

  6. 大数据系列(4)——Hadoop集群VSFTP和SecureCRT安装配置

    前言 经过前三篇文章的介绍,已经通过VMware安装了Hadoop的集群环境,当然,我相信安装的过程肯定遇到或多或少的问题,这些都需要自己解决,解决的过程就是学习的过程,本篇的来介绍几个Hadoop环 ...

  7. 大数据系列之数据仓库Hive命令使用及JDBC连接

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

  8. 大数据系列之分布式计算批处理引擎MapReduce实践-排序

    清明刚过,该来学习点新的知识点了. 上次说到关于MapReduce对于文本中词频的统计使用WordCount.如果还有同学不熟悉的可以参考博文大数据系列之分布式计算批处理引擎MapReduce实践. ...

  9. 大数据系列之数据仓库Hive原理

    Hive系列博文,持续更新~~~ 大数据系列之数据仓库Hive原理 大数据系列之数据仓库Hive安装 大数据系列之数据仓库Hive中分区Partition如何使用 大数据系列之数据仓库Hive命令使用 ...

随机推荐

  1. 随笔记录 MBR扇区故障系统备份与还原 2019.8.7

    系统备份: [root@localhost ~]# mkdir /abc [root@localhost ~]# mount /dev/sdb1 /abc [root@localhost ~]# dd ...

  2. Java 巴什博弈(取石子报数问题)

    巴什博弈:有一堆n个物品,两个人轮流从这堆物品中取物,规定每次至少取一个,最多取m个.最后取光者得胜.   规律:如果n=m+1,那么由于一次最多只能取m个,所以,无论先取者拿走多少个,后取者都能够一 ...

  3. phonegap 开发指南系列----简介(2)

    一.简介      Cordova提供了一组设备相关的API,通过这组API,移动应用能够以JavaScript访问原生的设备功能,如摄像头.麦克风等.      Cordova还提供了一组统一的Ja ...

  4. scala中类的简单使用记录

    import scala.collection.mutable.ArrayBuffer /** * scala 中内部类的使用 */ class Classes { class Stu(name:St ...

  5. java 数组常见操作

    1.遍历  依次访问数组中的每个元素 public class ArrayDemo04 { public static void main(String[] args) { int[] arr = { ...

  6. 【转载】浅谈Linux内存管理机制

    经常遇到一些刚接触Linux的新手会问内存占用怎么那么多? 在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然.这是Linux内存管理的一个优秀特性,在 ...

  7. thinkphp 定界符

    模板文件可以包含普通模板标签和XML模板标签,标签的定界符都可以重新配置. 大理石平台厂家 普通标签 内置模板引擎的普通模板标签默认以{ 和 } 作为开始和结束标识,并且在开始标记紧跟标签的定义,如果 ...

  8. Parse:App开发必备 让应用开发效率提高上百倍

    Parse一个应用开发工具, 是由Y Combinator所孵化的创业公司.使用Parse能把效率提高10倍到100倍.通常情况下,从开发用户到推广用户需要花几周时间,用了Parse则只需几小时.[U ...

  9. Responder对象

    Responder对象 响应者是一个对象,它可以响应事件并处理它们.所有响应者对象是类的,最终从UIResponder的( IOS)或NSResponder ( OS X)继承实例.这些类声明一个编程 ...

  10. PHPExcel SUM 返回0

    使用PHPExcel 导出Excel最后的代码是: $objWriter = PHPExcel_IOFactory::createWriter($this->excel, 'Excel2007' ...