Apache Pig的一些基础概念及用法总结(2)

栏目: Apache · 发布时间: 6年前

内容简介:Apache Pig的一些基础概念及用法总结(2)

转载必须注明出处: http://www.codelast.com/

本文可以让刚接触pig的人对一些基础概念有个初步的了解。
本文的大量实例都是作者Darran Zhang(website: codelast.com)在工作、学习中总结的经验或解决的问题,并且添加了较为详尽的说明及注解,此外,作者还在不断地添加本文的内容,希望能帮助一部分人。
要查看Pig系列教程,请点击 【这里】

Apache pig 是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。Twitter就大量使用pig来处理海量数据——有兴趣的,可以看Twitter工程师写的 这个PPT
但是,刚接触pig时,可能会觉得里面的某些概念以及程序实现方法与想像中的很不一样,甚至有些莫名,所以,你需要仔细地研究一下基础概念,这样在写pig程序的时候,才不会觉得非常别扭。

本文基于以下环境:
pig 0.8.1

先给出两个链接: pig参考手册1pig参考手册2 。本文的部分内容来自这两个手册,但涉及到翻译的部分,也是我自己翻译的,因此可能理解与英文有偏差,如果你觉得有疑义,可参考英文内容。

(1) LIMIT操作并不会减少读入的数据量
如果你只需要输出一个小数据集,通常你可以使用LIMIT来实现,例如:

A = LOAD '1.txt' AS (col1: int, col2: chararray);
B = LIMIT A 5;
DUMP B;

Pig会只加载5条记录,就不再读取其他的记录了吗?答案是:不会。Pig将读取数据文件中的所有记录,然后再从中挑5条。这是Pig可以做优化、却没有做的一点。
【更新】 Pig 0.10已经有了这功能了:

Push Limit into Loader
Pig optimizes limit query by pushing limit automatically to the loader, thus requiring only a fraction of the entire input to be scanned.
按我的理解,上面这段话的含义是:Pig将LIMIT查询自动优化到loader中,这样就只会扫描整个输入数据集的一部分(而不是全部)。

文章来源: http://www.codelast.com/
(2) 使用UDF不一定要在Pig脚本中REGISTER,也可以在命令行指定
大家知道,使用UDF需要在Pig脚本中REGISTER该UDF的jar包,但你可能不知道,你也可以不在Pig脚本中REGISTER它,而是通过命令行指定:

pig -Dpig.additional.jars=/home/codelast/a.jar:/home/codelast/b.jar:/home/codelast/c.jar test.pig

以上命令告诉了我们几件事:
我们让Pig执行了test.pig脚本;
我们向Pig传入了“pig.additional.jars”这样一个参数,此参数的作用相当于在Pig脚本中REGISTER jar包;
如果你要REGISTER多个jar包,只需像上面的例子一样,用分号(:)把多个jar包路径隔开即可;
test.pig必须写在最后,而不能写成“ pig test.pig -Dpig.additional.jars=XXX ”这样,否则Pig直接报错:

ERROR 2999: Unexpected internal error. Encountered unexpected arguments on command line – please check the command line.

当然,为了可维护性好,你最好把REGISTER jar包写在Pig脚本中,不要通过命令行传入。

(3) 使用ORDER排序时,null会比所有值都小
用ORDER按一个字段排序,如果该字段的所有值中有null,那么null会比其他值都小。

(4) 如何按指定的几个字段来去重
去重,即去除重复的记录。通常,我们使用DISTINCT来去除整行重复的记录,但是,如果我们只想用几个字段来去重,怎么做?
假设有以下数据文件:

[root@localhost ~]$ cat 1.txt 
1	2	3	4	uoip
1	2	3	4	jklm
9	7	5	3	sdfa
8	8	8	8	dddd
9	7	5	3	qqqq
8	8	8	8	sfew

我们要按第1、2、3、4个字段来去重,也就是说,去重结果应为:

1	2	3	4	uoip
9	7	5	3	sdfa
8	8	8	8	dddd

那么,我们可以这样做:

A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray, col4: chararray, col5: chararray);
B = GROUP A BY (col1, col2, col3, col4);
C = FOREACH B {
	D = LIMIT A 1;
	GENERATE FLATTEN(D);
};
DUMP C;

文章来源: http://www.codelast.com/
输出结果为:

(1,2,3,4,uoip)
(8,8,8,8,dddd)
(9,7,5,3,sdfa)

代码很简单,就是利用了GROUP时会自动对group的key去重的功能,这里不用多解释大家应该也能看懂。

(5) 如何设置Pig job的名字,使得在Hadoop jobtracker中可以清晰地识别出来
在Pig脚本中的一开始处,写上这一句:

set job.name 'This is my job';

将使得Pig job name被设置为“This is my job”,从而在Hadoop jobtracker的web界面中可以很容易地找到你的job。如果不设置的话,其名字将显示为“ PigLatin:DefaultJobName ”。

(6)scalar has more than one row in the output ”错误的一个原因
遇到了这个错误?我来演示一下如何复现这个错误。
假设有两个文件:

[root@localhost ~]$ cat a.txt 
1	2
3	4
[root@localhost ~]$ cat b.txt 
3	4
5	6

现在我们来做一个JOIN:

A = LOAD 'a.txt' AS (col1: int, col2: int);
B = LOAD 'b.txt' AS (col1: int, col2: int);
C = JOIN A BY col1, B BY col1;
D = FOREACH C GENERATE A.col1;
DUMP D;

这段代码是必然会fail的,错误提示为:

org.apache.pig.backend.executionengine.ExecException: ERROR 0: Scalar has more than one row in the output. 1st : (1,2), 2nd :(3,4)

文章来源: http://www.codelast.com/
乍一看,似乎代码简单得一点问题都没有啊?其实仔细一看,“ A.col1 ”的写法根本就是错误的,应该写成“ A::col1 ”才对,因为你只要 DESCRIBE 一下 C 的schema就明白了:

C: {A::col1: int,A::col2: int,B::col1: int,B::col2: int}

Pig的这个错误提示得很不直观,在 这个链接 中也有人提到过了。

(7) 如何将数据保存为LZO压缩格式的文本文件
还是借助于elephant-bird,可以轻易完成这个工作:

A =LOAD 'input';
STORE A INTO 'output' USING com.twitter.elephantbird.pig.store.LzoPigStorage();

结果就会得到一堆名称类似于“ part-m-00000.lzo ”的文件。
注意以上省略了一堆的“ REGISTER XXX.jar ”代码,你需要自己添加上你的jar包路径。
有人说,那加载LZO压缩的文本文件呢?很简单:

A = LOAD 'output' USING com.twitter.elephantbird.pig.store.LzoPigStorage(',');

这表示指定了分隔符为逗号,如果不想指定,省略括号中的内容即可。

(未完待续)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

与机器赛跑

与机器赛跑

[美]埃里克·布林约尔松(Erik Brynjolfsson)、[美]安德鲁·麦卡菲(Andrew McAfee) / 闾佳 / 2013-1-20 / 6.00

一场数字革命正在加速进行。 一些科幻小说里的场景已经在现实中发生:无人驾驶汽车开上了公路;智能设备能高效地翻译人类语言;人工智能系统在智力竞赛里击败了所有人类选手;工厂雇主开始购买更多的新机器,却不招新工人…… 这些例子都证明,数字技术正在快速地掌握原本只属于人类的技能,并深刻地影响了经济。虽然大多数影响是积极的:数字革新将提高效率、降低商品价格(甚至到免费),以及增加经济总量。 ......一起来看看 《与机器赛跑》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

URL 编码/解码
URL 编码/解码

URL 编码/解码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换