8

4つの結果を生成するPIGスクリプトがあり、それらすべてを1つのファイルに保存したいと思います。使ってみましUNIONたが、使うUNIONとpart-m-00000、part-m-00001、part-m-00002、part-m-00003の4つのファイルが出てきます。単一のファイルを取得できませんか?

これがPIGスクリプトです

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

AAフォルダー内には、上記のように4つのファイルがあります。すべてのエントリを含む単一のファイルを取得できませんか?

4

2 に答える 2

14

Pigはここで正しいことを行っており、データセットを統合しています。すべてが1つのファイルであることは、Hadoopの1つのデータセットを意味するわけではありません... Hadoopの1つのデータセットは通常、フォルダーです。ここではreduceを実行する必要がないため、実行されません。

Map AND Reduceを実行するには、Pigをだます必要があります。私が通常これを行う方法は次のとおりです。

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そのリストが爆発して元に戻ります。


ここで注意すべきことの1つは、これは実行することとそれほど変わらないということです。

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

(これは、すべてのテキストを連結し、それを新しいファイルとしてHDFSに書き戻すことです)

これはまったく並行していませんが、1つのレデューサーを介してすべてのデータを集中させることもできません。

于 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 に答える