查看更多Apache Pig的教程请点击这里。
用Apache Pig处理大数据时,经常会有这种需求:把输入数据按指定的字段group,并且每个group内只输出时间最新的一条记录。
查看更多Apache Pig的教程请点击这里。
来看这个例子。有数据文件 1.txt,内容为:
a[\t][\t]c[\t]f[\t]gh[\t]k[\t]
[\t][\t][\t]
A = LOAD '1.txt' AS (col1: chararray, col2: chararray, col3: chararray);
B = FOREACH A GENERATE (col1 IS NOT NULL ? col1 : '1') AS col1, (col2 IS NOT NULL ? col2 : '2') AS col2, (col3 IS NOT NULL ? col3 : '3') AS col3;
DUMP B;
输出:
(a,2,c)(1,f,g)(h,k,3)(1,2,3)
代码非常简单:如果第一列col1为空则替换为1,如果第二列为空则替换为2,如果第三列为空则替换为3。
这里使用了三元运算符 ? : 来做这个判断,写法非常丑陋。
查看更多Apache Pig的教程请点击这里。
运行Pig脚本时报错:
Error before Pig is launched
----------------------------
ERROR 2997: Encountered IOException. org.apache.pig.tools.parameters.ParseException: Encountered "<EOF>" at line 1, column 8.
Was expecting one of:
<IDENTIFIER> ...
<OTHER> ...
<LITERAL> ...
<SHELLCMD> ...
java.io.IOException: org.apache.pig.tools.parameters.ParseException: Encountered "<EOF>" at line 1, column 8.
Was expecting one of:
<IDENTIFIER> ...
<OTHER> ...
<LITERAL> ...
<SHELLCMD> ...
at org.apache.pig.impl.PigContext.doParamSubstitution(PigContext.java:408)
at org.apache.pig.Main.runParamPreprocessor(Main.java:783)
at org.apache.pig.Main.run(Main.java:446)
at org.apache.pig.Main.main(Main.java:158)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.apache.hadoop.util.RunJar.run(RunJar.java:221)
at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
Caused by: org.apache.pig.tools.parameters.ParseException: Encountered "<EOF>" at line 1, column 8.
查看更多Apache Pig的教程请点击这里。
▶▶ 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 LoaderPig optimizes limit query by pushing limit automatically to the loader, thus requiring only a fraction of the entire input to be scanned.
文章来源:http://www.codelast.com/
▶▶ 使用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脚本中,不要通过命令行传入。
查看更多Apache Pig的教程请点击这里。
Apache Pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。
本文基于以下环境:
pig 0.8.1
文章来源:http://www.codelast.com/
(1)CROSS操作
由于求交叉积可能会导致结果数据量暴增,因此,CROSS操作是一个“昂贵”的操作,可能会耗费Hadoop集群较多的资源,使用的时候需要评估一下数据量的大小。
本文包含Apache Pig的一些进阶技巧及用法小结。如要学习基础教程,请查看我写的【其他几篇文章】。
本文的大量实例都是作者Darran Zhang(website: codelast.com)在工作、学习中总结的经验或解决的问题,并且添加了较为详尽的说明及注解,此外,作者还在不断地添加本文的内容,希望能帮助一部分人。
Apache Pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。
查看更多Apache Pig的教程请点击这里。
本文可以让刚接触pig的人对一些基础概念有个初步的了解。
很久很久以前,本文大概是互联网上第一篇公开发表的且涵盖大量实际例子的Apache Pig中文教程(由Google搜索可知),文中的大量实例都是作者Darran Zhang(website: codelast.com)在工作、学习中总结的经验或解决的问题,并且添加了较为详尽的说明及注解,希望能帮助一部分人。
Apache pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。
但是刚接触pig时,可能会觉得里面的某些概念以及程序实现方法与想像中的很不一样,所以,你需要仔细地研究一下基础概念,这样在写pig程序的时候,才不会觉得非常别扭。