8

我有一个 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 个文件。我不能得到一个包含所有条目的文件吗?

4

2 回答 2

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)

这根本不是并行的,但也不是通过一个 reducer 汇集所有数据。

于 2012-06-09T13:26:55.757 回答
1

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

grunt> set default_parallel 1
grunt> A = UNION Message_1,Message_2,Message_3,Message_4;
于 2012-06-08T22:27:35.680 回答