将UNION的结果存储在单个文件中的PIG中

时间:2012-06-08 19:20:50

标签: hadoop apache-pig hdfs

我有一个PIG脚本,可以产生四个结果 我想将所有这些存储在一个文件中。 我尝试使用UNION,但是当我使用UNION时,我得到四个文件part-m-00000,part-m-00001,part-m-00002,part-m-00003。我不能得到一个文件吗?

这是PIG脚本

A = UNION Message_1,Message_2,Message_3,Message_4 into 'AA';

在AA文件夹中,我得到了4个文件,如上所述。我不能得到包含所有条目的单个文件吗?

2 个答案:

答案 0 :(得分:14)

Pig在这里正在做正确的事情并且正在联合数据集。一个文件都不是Hadoop中的一个数据集... Hadoop中的一个数据集通常是一个文件夹。因为它不需要在这里运行reduce,所以它不会。

你需要欺骗Pig来运行Map AND Reduce。我通常这样做的方式是:

set default_parallel 1

...
A = UNION Message_1,Message_2,Message_3,Message_4;
B = GROUP A BY 1; -- group ALL of the records together
C = FOREACH B GENERATE FLATTEN(A);
...

GROUP BY将所有记录组合在一起,然后FLATTEN将列出的列表退出。


这里要注意的一点是,这与做法没有多大区别:

$ hadoop fs -cat msg1.txt msg2.txt msg3.txt msg4.txt | hadoop fs -put - union.txt

(这是连接所有文本,然后将其作为新文件写回HDFS)

这根本不是平行的,但也没有通过一个减速器汇集所有数据。

答案 1 :(得分:1)

您是否尝试过设置default_parallel属性?

grunt> set default_parallel 1
grunt> A = UNION Message_1,Message_2,Message_3,Message_4;