原创不易,转载请务必注明,原创地址,谢谢配合!
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. ASP.NET网站要手机自适应页面

    本文转载的地址:http://mobile.51cto.com/ahot-409516.htm 一. 允许网页宽度自动调整: "自适应网页设计"到底是怎么做到的? 其实并不难. 首 ...

  2. Got permission denied while trying to connect to the Docker daemon

    答案:https://stackoverflow.com/questions/48568172/docker-sock-permission-denied

  3. Git 如何使用ssh上传或者同步/下载项目到github

    上传本地代码及更新代码到GitHub教程 上传本地代码 第一步:去github上创建自己的Repository,创建页面如下图所示: 红框为新建的仓库的https地址 第二步: echo " ...

  4. if else 和 swith效率比较

    读大话设计模式,开头的毛病代码用if else实现了计算器,说计算机做了三次无用功,优化后是用switch,那么switch为什么比if else效率高呢, 百度找了几个说是底层算法不一样,找了一个比 ...

  5. git连接gitee笔记

    #首先参照 https://blog.csdn.net/zhangyu4863/article/details/80427289 #然后需要注意,在办公室无法使用 git remote add ori ...

  6. mysql主从同步的键值冲突问题的解决方法

    转自https://njs375666635.iteye.com/blog/2242067 多主互备和主从复制有一些区别,因为多主中都可以对服务器有写权限,所以设计到自增长重复问题 出现的问题(多主自 ...

  7. JQUERY 效果 遍历 事件

    效果 隐藏与显示  hide() 和 show() 淡入淡出  fadeIn(speed,callback).fadeOut(speed,callback). fadeToggle() 方法可以在 f ...

  8. Photoshop基本操作

    PS 工具是我们使用频率比较高的软件之一, 我们学习PS目的不是为了设计海报做电商和UI的,而是要求: 会简单的抠图 会简单的修改PSD效果图 熟练的切图 能和网站美工美眉有共同话题..... Pho ...

  9. 强连通图缩点——cf999E

    问题转换成缩点求度数为0的点的个数,s点所在联通块作额外处理 缩点写的很烂调了一早上.. #include<bits/stdc++.h> #include<vector> us ...

  10. 請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢

    請問各位大大,我要將listview顯示的縮圖加入到listview2,請問該如何做呢?下面的function可以將listview的縮圖加到listview2但是全都顯示listview1第一張的圖 ...