将联合的结果存储在一个文件中

rwqw0loc  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(256)

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

a9wyjsp7

a9wyjsp71#

pig在这里做的是正确的,并且正在联合数据集。在hadoop中,所有文件都是一个并不意味着一个数据集。。。hadoop中的一个数据集通常是一个文件夹。既然它不需要在这里运行reduce,它就不会。
你需要愚弄Pig运行Map和减少。我通常的做法是:

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)
这根本不是并行的,但也不是通过一个减速机将所有数据汇集到一起。

dwthyt8l

dwthyt8l2#

您尝试过设置默认的\u parallel属性吗?

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

相关问题