*本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解。目前正在持续更新中。*

Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapReduce的一种脚本语言,大大简化了对数据操作的代码。

**

基本概念和用法

**:

1. 关系(relation):即包(bag),是一个元组(tuple)的集合。

可将关系/包想象成Spark中RDD的概念。

元组()同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就是一个包。

注意:

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.s

plit.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可小写。

参考:

1. Tweeter工程师写的PPT:http://www.slideshare.net/kevinweil/hadoop-pig-and-twitter-nosql-east-2009

2. 官方文档:http://pig.apache.org/docs/r0.15.0/basic.html

Pig基础学习【持续更新中】的更多相关文章

  1. Pig语言基础-【持续更新中】

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

  2. nodejs基础【持续更新中】

    简介 Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js uses an event-dr ...

  3. Java基础——集合(持续更新中)

    集合框架 Java.util.Collection Collection接口中的共性功能 1,添加 booblean add(Object obj);  往该集合中添加元素,一次添加一个 boolea ...

  4. Java基础——多线程(持续更新中)

    如何建立一个执行路径呢? 通过查询API文档 java.lang.Thread类 该类的描述中有创建线程的两种方式 1.继承Thread类 (1).将类声明为 Thread 的子类 (2).该子类应重 ...

  5. Linux 基础命令 持续更新中...

    1.ls 显示当前文件/文件夹 显示文件大小: ls -lh  显示隐藏文件: ls -a 显示文件详细信息: ls -l (ll)2.pwd 显示当前所在路径 cat 显示当前文件下所有内容3.cd ...

  6. 痞子衡嵌入式:史上最强i.MX RT学习资源汇总(持续更新中...)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MX RT学习资源. 类别 资源 简介 官方汇总 i.MXRT产品主页 恩智浦官方i.MXRT产品主页,最权威的资料都在这里,参考手 ...

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

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

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

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

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

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

随机推荐

  1. IBatis 批量插入数据之SqlBulkCopy

    public void AddLetters(IList<int> customerIds, string title, string content, LetterEnum.Letter ...

  2. OC JS交互(通常情况下,如果网页写得正规的话,是可以正常交互的,之前就遇到后台写h5始终拿不到事件,元素也拿不到,更别说交互了,真是奇了怪了)

    自动填充表单 @"document.getElementById('loginid').value = '这里填入你的用户名';document.getElementById('userpa ...

  3. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  4. 大熊君学习html5系列之------History API(SPA单页应用的必备)

    一,开篇分析 Hi,大家好!大熊君又和大家见面了,(*^__^*) 嘻嘻……,这系列文章主要是学习Html5相关的知识点,以学习API知识点为入口,由浅入深的引入实例, 让大家一步一步的体会" ...

  5. 都别说工资低了,我们来一起写简单的dom选择器吧!

    前言 我师父(http://www.cnblogs.com/aaronjs/)说应当阅读框架(jquery),所以老夫就准备开始看了 然后公司的师兄原来写了个dom选择器,感觉不错啊!!!原来自己从来 ...

  6. spring-quartz.xml

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://ww ...

  7. iOS中常用属性的关键字的使用说明

    属性关键字的作用 现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码.因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,no ...

  8. [Search Engine] 搜索引擎技术之网络爬虫

    随着互联网的大力发展,互联网称为信息的主要载体,而如何在互联网中搜集信息是互联网领域面临的一大挑战.网络爬虫技术是什么?其实网络爬虫技术就是指的网络数据的抓取,因为在网络中抓取数据是具有关联性的抓取, ...

  9. C/C++ 笔试题

    /////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程 ...

  10. java后端制作MD5加密

    由于一次业务的需要,我制作了一次密码的修改子业务. 当用户忘记密码的情况下,我需要动态的发给他一个6位的随机密码,通过即时通,短信,微信等.并同时修改数据库中的原密码为这6位的随机密码.让用户再去修改 ...