原创不易,转载请务必注明,原创地址,谢谢配合!
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. Caused by: android.view.InflateException: Binary XML file line #18: Binary XML file line #18: Error inflating class android.widget.CheckedTextView

    困扰了我一天啊 终于吧 这个大bug  给解决掉了 可能是 当时懵逼了  竟然忘记重新构造了!!尴尬了 直接把项目的 build  文件删除重新构造了一边!!

  2. leetcood学习笔记-82-删除排序链表中的重复元素二

    题目描述: 方法一: class Solution(object): def deleteDuplicates(self, head): """ :type head: ...

  3. java 数组常见操作

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

  4. jQuery FormData使用方法

    FormData的主要用途 将form表单元素的name与value进行组合,实现表单数据的序列化,从而减少表单元素的拼接,提高工作效率. 异步上传文件 注:FormData 对象的字段类型可以是 B ...

  5. 计算几何——线段和直线判交点poj3304

    #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> #i ...

  6. web Magic报错 NoSuchMethodError NoSuchMethodError: com.google.common.util.concurrent.SimpleTimeLimiter

    webMagic使用selenium的时候遇到报错: java.lang.NoSuchMethodError: com.google.common.util.concurrent.SimpleTime ...

  7. js面试总结3

    异步和单线程 题目: 1.同步和异步的区别? 2.一个关于setTimeout的笔试题. 3.前段使用异步的场景有哪些? 什么是异步? console.log(100) setTimeout(func ...

  8. 洛谷 P2114 [NOI2014]起床困难综合症

    题目描述 21世纪,许多人得了一种奇怪的病:起床困难综合症,其临床表现为:起床难,起床后精神不佳.作为一名青春阳光好少年,atm一直坚持与起床困难综合症作斗争.通过研究相关文献,他找到了该病的发病原因 ...

  9. 如何区分无线AP跟无线路由器

    无线AP是一个无线网络的接入点,俗称“热点”.主要有路由交换接入一体设备和纯接入点设备,一体设备执行接入和路由工作,纯接入设备只负责无线客户端的接入,纯接入设备通常作为无线网络扩展使用,与其他AP或者 ...

  10. eclipse配置外部工具利用javah编译生成头文件

    1. 点击eclipse工具栏外部工具按钮,打开配置外部工具 2. 新建一个启动配置,起名为Generate C and C++ Header File,按照下图配置好相应的参数 3. 运行该工具时, ...