[原创] Apache Pig 加载/解析/读取 XML数据

XML logo

查看更多Apache Pig的教程请点击这里

用Apache Pig加载/解析/读取XML数据不是一个常见的需求,但有时为了方便我们又不得不用,其实Pig的UDF库piggybank已经帮大家做好了这个工作了:只需要使用其中的XMLLoader,就可以方便地实现XML文件解析。

阅读更多

[原创] Apache Pig如何按数据分组保存到不同的子目录中(MultiStorage)

查看更多Apache Pig的教程请点击这里

用Apache Pig进行数据处理的时候,我们通常会在最后把处理结果保存到一个HDFS目录下:

STORE result INTO '/my_output_dir';

这是最常见的情况。
但是,如果我们想根据某个字段,把数据分成多组,分别存储在多个目录下呢?举个可能不恰当的例子,就有点像我们先把数据按某个字段分组:

GROUP data BY field;

再把各个group的数据分别存储在不同的目录下一样。

阅读更多

[原创] Apache Pig解析JSON数据

JSON

查看更多Apache Pig的教程请点击这里

在大数据处理领域,JSON格式的数据非常常见,然而用Apache Pig读取JSON并正确取出其中的字段我觉得并不算方便(在某些情况下很容易写错),所以总结一下几个常见的JSON loader/UDF的用法。

假设有数据文件 1.txt,内容是一行JSON(为了简单,这里以一行为例):

{"items":[{"id":"111","name":"aaa","extra":{"k":"ttt","v":"uuu"}},{"id":"222","name":"bbb","extra":{"k":"rrr","v":"sss"}}]}

阅读更多

[原创] 使用Apache DataFu中的Coalesce()简化Apache Pig的三元运算符

查看更多Apache Pig的教程请点击这里

来看这个例子。有数据文件 1.txt,内容为:

a[\t][\t]c
[\t]f[\t]g
h[\t]k[\t]
[\t][\t][\t]
其中 [\t] 表示制表符(tab),并不是真的在文件中写了 [\t]
在Pig命令行交互模式下加载这个文件,并把其中为空(NULL)的列替换成一些数字:

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。
这里使用了三元运算符 ? : 来做这个判断,写法非常丑陋。

阅读更多

[原创] 如何减少map-only的Pig job的输出文件数

查看更多Apache Pig的教程请点击这里

如果一个Pig job是map-only的job,并且其输入文件数很多的话,那么输出的文件数也会同样多,此时,如果每个文件大小又比较小的话,长久下去就会对Haodoop NameNode造成很大压力。我们可以通过给Pig job添加一个reduce过程来减少输出文件数。

阅读更多

[原创] Apache Pig问题:Encountered IOException. org.apache.pig.tools.parameters.ParseException: Encountered ""

查看更多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.
文章来源:https://www.codelast.com/
这个问题有可能有多种原因,比如某行漏写了语句结尾的分号。这里我遇到的是另一个原因:调用该Pig脚本的shell脚本,用 -p "xxx=$X" 这种形式传参时,参数为空,修正参数为空的问题即可解决。

阅读更多

[原创] 如何在Apache Pig中判断一个bag中是否包含特定的元素

查看更多Apache Pig的教程请点击这里

In Pig Latin, how to check if an element is present in a bag?

假设一个bag是由 int 元素组成的(可以理解为一个list),那么,如何判断这个bag中是否包含指定的元素(例如 5)呢?
如果你看过Pig的doc,就知道它并没有自带这样一个函数,可以输入一个bag,以及另一个值作为参数,然后输出1或0来表示bag是否包含这个元素。
所以,我们该如何实现这个功能?

阅读更多

[原创] 如何用Apache Pig输出压缩格式的SequenceFile

查看更多Apache Pig的教程请点击这里

SequenceFile是Hadoop API提供的一种二进制文件,它将数据以<key,value>的形式序列化到文件中。

如果你要用Apache Pig读取这种类型的数据,可以用 PiggyBank 中的SequenceFileLoader——我没有用过,但肯定是没问题的。

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

查看更多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 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/
▶▶ 使用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的教程请点击这里

Apache Pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。

本文基于以下环境:
pig 0.8.1
文章来源:http://www.codelast.com/
(1)CROSS操作
由于求交叉积可能会导致结果数据量暴增,因此,CROSS操作是一个“昂贵”的操作,可能会耗费Hadoop集群较多的资源,使用的时候需要评估一下数据量的大小。

阅读更多

[原创]Apache Pig中文教程(进阶)

本文包含Apache Pig的一些进阶技巧及用法小结。如要学习基础教程,请查看我写的【其他几篇文章】
本文的大量实例都是作者Darran Zhang(website: codelast.com)在工作、学习中总结的经验或解决的问题,并且添加了较为详尽的说明及注解,此外,作者还在不断地添加本文的内容,希望能帮助一部分人。

Apache Pig是用来处理大规模数据的高级查询语言,配合Hadoop使用,可以在处理海量数据时达到事半功倍的效果,比使用Java,C++等语言编写大规模数据处理程序的难度要小N倍,实现同样的效果的代码量也小N倍。

阅读更多

[原创]Apache Pig的一些基础概念及用法总结(1)

查看更多Apache Pig的教程请点击这里

本文可以让刚接触pig的人对一些基础概念有个初步的了解。
很久很久以前,本文大概是互联网上第一篇公开发表的且涵盖大量实际例子的Apache Pig中文教程(由Google搜索可知),文中的大量实例都是作者Darran Zhang(website: codelast.com)在工作、学习中总结的经验或解决的问题,并且添加了较为详尽的说明及注解,希望能帮助一部分人。

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

阅读更多