***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解。目前正在持续更新中。***
 
Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapReduce的一种脚本语言,大大简化了对数据操作的代码。
基本概念和用法:
1. 关系(relation):即包(bag),是一个元组(tuple)的集合。元组()同Spark中元组的概念。
2. 简单的文件载入操作:
A = LOAD 'a.txt' AS (col1:chararray, col2:int);
B = GROUP A BY (col1);
DUMP A;
DUMP B;
上段代码将a.txt中的内容加载到变量A中,A的数据结构为A:{col1: chararray,col2:int},A就是一个包,个人理解类似于Spark中的RDD。
注意:
1)这里面=左右两边要有空格,否则报错。
2)load as,dump等不区分大小写。
3)load as后面括号里col1和col2都是别名,如果不指定别名,后面的代码可以使用$0,$1...处理,此处使用别名是为了增强可读性。
3. 包中数据处理操作:
C=FOREACH B GENERATE group, AVG(A.col2);
遍历B中元素产生group,col2平均值
 

关系操作

LOAD

将数据从文件系统中载入。
LOAD 'data' [USING function] [AS schema];

USING关键字指定loading function,默认是PigStorage,当然也可以使用用户自己定义的UDF。  
示例:
A = LOAD 'data' AS (f1:int, f2:int);
注:schema即模式,可以理解元数据,用"()"括起来。

DISTINCT

在关系/包中去重。
alias = DISTINCT alias [PARTITION BY partitioner] [PARALLEL n]; 
patitioner:MapReduce中Mapper阶段的Partitioner。
PARALLEL:可以改变job的并行度,改变了reduce task的数目。
为了去重,数据首先要排好序。’
示例:
X = DISTINCT A

将包/关系A中重复记录去掉,并赋值给新的包/关系X。

 

多维度中,计算几个维度组合下的不重复记录数。

按照指定几个字段来去重:DISTINCT去除整行重复的数据。该命令会触发reduce过程,同时在Mapper阶段也是会使用Combiner做聚合操作的。
register:注册udf jar包然后脚本中即可使用。
set:可在pig脚本的开头来设置job的参数,如set mapred.min.split.size 2147483648; 设置参数的单位是字节。
设置pig job的名字,在hadoop jobtracker 页面就能很快找到自己的job:set job.name 'haha'
输出LZO压缩格式的文本文件,可借助于elephant-bird,两种方式:
 
方式1:
A =LOAD'input';
STORE A INTO'output'USING com.twitter.elephantbird.pig.store.LzoPigStorage();
方式2:
在pig脚本的最前面加上两句话:
set mapred.output.compression.codec 'com.hadoop.compression.lzo.LzopCodec';
set mapred.output.compress 'true';
这种方式在store的时候不用using,会将文件自动保存为LZO格式。

加载LZO压缩文件:

A = LOAD 'output' USING com.twitter.elephantbird.pig.store.LzoPigStorage(',');
指定了分隔符为逗号,如果不想指定,括号内不加即可。
 

STREAM

把数据送到外部脚本或程序运行。
 
alias = STREAM alias [, alias …] THROUGH {`command` | cmd_alias } [AS schema] ;

alias:包

command:通过反引号 ` 括起来,可以包含参数。
schema的例子:X = STREAM A THROUGH `stream.pl` as (f1:int, f2:int, f3:int);
例如,可以将Python程序嵌入到Pig中使用。
建立一个Python文件pass.py,示例程序:
 #! /usr/bin/envpython
import sys for line insys.stdin:
(c,n,s) = line.split()
if int(s) >= 60:
print "%s\t%s\t%s"%(c,n,s)

执行以下命令:

define pass `pass.py` SHIP('/home/user/pass.py');
records_pass = stream records through pass as(classNo:chararray, studNo:chararray, score:int);
dump records_pass;

上面命令中ship命令是将python程序提交到Hadoop集群中。pass后面的pass.py外是反引号。

 

FILTER

基于某种条件从包中选择元组。
alias = FILTER alias  BY expression;

expression的返回值是boolean类型,为true则保留该条记录,为false则舍弃该条记录。

示例:

X = FILTER A BY (f1 == 8) OR (NOT (f2+f3 > f1));

DUMP X;
(4,2,1)
(8,3,4)
(7,2,5)
(8,4,3)

FOREACH

基于数据列做数据转换。

 
alias  = FOREACH { block | nested_block };
block:alias作为外部包,通过FOREACH...GENERATE操作:alias = FOREACH alias GENERATE expression [AS schema] [expression [AS schema]….];

nested_block:alias作为内部包:

alias = FOREACH nested_alias {
alias = {nested_op | nested_exp}; [{alias = {nested_op | nested_exp}; …]
GENERATE expression [AS schema] [expression [AS schema]….]
};

注:

1. 内部包使用时要用{}括住内部块。

2. nested_op允许的操作有CROSS, DISTINCT, FILTER, FOREACH, LIMIT, and ORDER BY;nested_exp:任意的表达式

3. FOREACH最多只允许二重嵌套。

示例:

X = FOREACH B {
S = FILTER A BY 'xyz';
GENERATE COUNT (S.$0);
}

UDF相关

DEFINE

定义一种简称给UDF函数或者streaming命令。
语法:
DEFINE alias {function | [`command` [input] [output] [ship] [cache]] };
define udf com.sohu.adrd.data.pig.udf.sessionlog.AdPvClickUDF('super','pc','tvadview');
定义UDF的别名。
  • function:UDF函数。udf名字太长的时候可以简化,便于在程序中使用。
  • “|”后面的几个参数都是streaming的时候使用的命令。
  • command:通过反引号括起来,命令是任何可执行的命令,可以包含参数,如python命令,shell命令等。
  • input:输入文件或者标准输入,输入路径可以一个或多个。可以使用using关键字指定序列化器。将输入文件数据序列化成指定序列化格式。
  • output:标准输出|标准错误输出|输出文件。一个或多个值。可通过using关键字指定反序列化器。将序列化数据反序列化成原文件数据。
  • ship:文件路径。可以将依赖文件从主节点传输到集群中的工作节点。注意,这里是文件,不能是目录。适用于小文件,jar包,二进制文件。
    define x `stream.pl` ship('/work/stream.pl');
    y = stream A through x;
  • cache:分布式文件系统中的文件路径名,处理已经被放在计算节点上的大文件。文件而非目录。'dfs_path#dfs_file'

    define y `stream.pl data.gz` ship('/work/stream.pl') cache('/input/data.gz#data.gz');
    x = stream A through y;
    注:
    1. DEFINE可小写。
    2. 以上文件路径名都用单引号括起来。

REGISTER

REGISTER后面接jar包,在写pig脚本文件内部使用,这样文件就可以直接使用jar包中的UDF。

UDF的jar包在Pig脚本中指定的一种方式。
REGISTER myudf.jar 然后就可以在Pig脚本中使用自己的myudf.jar中的东西。
另一种注册方式是在执行Pig命令行中加参数 -Dpig.additional.jars的形式指定jar包路径,键值对形式,如果有多个jar,jar之间可用:符号分隔。

注:REGISTER可小写。
 

Pig语言基础-【持续更新中】的更多相关文章

  1. 嘿,C语言(持续更新中...)

    ---恢复内容开始--- 上次简单介绍了一下C语言,这次说说数据与计算程序,那么话不多说,进来看看. 第二章      数据与简单的计算程序 一:数据 既然说到了数据,那么说说什么是写数据呢? 表面意 ...

  2. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  3. 《WCF技术剖析》博文系列汇总[持续更新中]

    原文:<WCF技术剖析>博文系列汇总[持续更新中] 近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析(卷1)>的写作,一直无暇管理自己的Blog.在<WCF技术剖 ...

  4. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  5. Atom使用记录(持续更新中)

    部分内容取自:http://www.jianshu.com/p/dd97cbb3c22d,我自己也在使用,持续更新中 Atom安装插件在窗口中File---Setting---install 在里面进 ...

  6. java视频教程 Java自学视频整理(持续更新中...)

    视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...

  7. 【前端】Util.js-ES6实现的常用100多个javaScript简短函数封装合集(持续更新中)

    Util.js (持续更新中...) 项目地址: https://github.com/dragonir/Util.js 项目描述 Util.js 是对常用函数的封装,方便在实际项目中使用,主要内容包 ...

  8. PTA|团体程序设计天梯赛-练习题目题解锦集(C/C++)(持续更新中……)

    PTA|团体程序设计天梯赛-练习题目题解锦集(持续更新中) 实现语言:C/C++:      欢迎各位看官交流讨论.指导题解错误:或者分享更快的方法!! 题目链接:https://pintia.cn/ ...

  9. 前端面试题总结——HTML(持续更新中)

    前端面试题总结--HTML(持续更新中) 1.什么是HTML? HTML:HyperText Markup Language超文本标记语言 2.XHTML和HTML有什么区别 HTML是一种基本的WE ...

随机推荐

  1. 15个JavaScript本地存储技术的函数库和工具

    当构建更复杂的JavaScript应用程序运行在用户的浏览器是非常有用的,它可以在浏览器中存储信息,这样的信息可以被共享在不同的页面,浏览会话. 在最近的过去,这将有可能只被cookies文本文件保存 ...

  2. Android ViewPager sharedpreferences

    http://www.cnblogs.com/dwinter/archive/2012/02/27/AndroidViewPager%E5%A4%9A%E9%A1%B5%E9%9D%A2%E6%BB% ...

  3. 大熊君大话NodeJS之------(Url,QueryString,Path)模块

    一,开篇分析 这篇文章把这三个模块拿来一起说,原因是它们各自的篇幅都不是很长,其次是它们之间存在着依赖关系,所以依次介绍并且实例分析.废话不多说了,请看下面文档: (1),"Url模块&qu ...

  4. VTK初学一,比较常见的错误2

    我的开发环境: 系统:win8.1 QT:5.4.2MinGW版 VTK:6.3 按照教程生成一个球体显示在,Qt的QVTKWidget控件中,出现如下ERROR: ERROR: In D:\VTK6 ...

  5. angularjs中父,子,兄之间controller值得传递

    使用angularjs,发现controller间的值传递,比较麻烦的,以后几篇文章会陆续说几种方法. 一,angularjs $broadcast $emit $on的处理思想 在一个control ...

  6. CentOS Linux系统下更改Apache默认网站目录

    引言: Apache默认的网站目录是在/var/www/html,我们现在要把网站目录更改到/home/wwwroot/web1/htdocs,操作如下 准备工作: 创建目录: cd /home mk ...

  7. 如何让Linux定时任务crond以秒为单位执行(如每隔3秒)

    需要用到Shell脚本每隔3秒钟去监控一个软件进程的运行状态,发现crond似乎只支持到分,不知道秒,怎么办呢? 第一种方法: 当然首先想到的是写一个触发的脚本,在触发脚本中使用死循环来解决此问题,如 ...

  8. Uva 2319

    理解:区域覆盖.假设该点在勘测半圆的边缘,求出与该点可在一个半圆的坐标范围l,r,然后,for 一次判断 #include<cstdio> #include<algorithm> ...

  9. 【Python网络爬虫一】爬虫原理和URL基本构成

    1.爬虫定义 网络爬虫,即Web Spider,是一个很形象的名字.把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛.网络蜘蛛是通过网页的链接地址来寻找网页的.从网站某一个页面(通常 ...

  10. BZOJ 3261: 最大异或和

    Description 一个序列,支持两个操作. 1.在序列尾加入一个数. 2.询问 [l,r] 中与 x 异或值最大的数. \(n\leqslant 3*10^5\) Sol 可持久化 Trie 树 ...