0

Hadoop/Pig は初めてです。

複数のファイルを含むディレクトリがあります。今、私はそれらのワードカウントを実行する必要があります. Hadoop サンプルの例の wordcount を使用してディレクトリで実行し、出力を取得できますが、出力は 1 つのファイルになります。各ファイルの出力を別のファイルにする必要がある場合はどうすればよいですか? Pigも使えます。そして、ディレクトリを豚への入力として与えます。ただし、ディレクトリ内のファイル名を読み取って LOAD に渡すにはどうすればよいですか? つまり、test1、test2、 test3
、test4、test5 の 5 つのファイルを含む Test ディレクトリがあるとします。ここで、各ファイルの単語数を別のファイルに分けて表示したいと思います。個々の名前を提供して実行できることはわかっていますが、それには多くの時間がかかります。ディレクトリからファイル名を読み取り、豚の LOAD への入力として提供することは可能ですか?

4

2 に答える 2

1

Pig バージョン 0.10.0 以降を使用している場合は、ソースのタグ付けMultiStorageの組み合わせを利用して、ファイルを追跡できます。

たとえばpigin、次のようなファイルとコンテンツを含む入力ディレクトリがあるとします。

pigin
|-test1 => "hello"
|-test2 => "world"
|-test3 => "Apache"
|-test4 => "Hadoop"
|-test5 => "Pig"

次のスクリプトは、各スクリプトを読み取り、各ファイルの内容を別のディレクトリに書き込みます。

%declare inputPath 'pigin'
%declare outputPath 'pigout'

-- Define MultiStorage to write output to different directories based on the
-- first element in the tuple
define MultiStorage org.apache.pig.piggybank.storage.MultiStorage('$outputPath','0');

-- Load the input files, prepending each tuple with the file name
A = load '$inputPath' using PigStorage(',', '-tagsource');

-- Write output to different directories
store A into '$outputPath' using MultiStorage();

上記のスクリプトは、次のような出力ディレクトリ ツリーを作成します。

pigout
|-test1
| `-test1-0 => "test1   hello"
|-test2
| `-test2-0 => "test2   world"
|-test3
| `-test3-0 => "test3   Apache"
|-test4
| `-test4-0 => "test4   Hadoop"
|-test5
| `-test5-0 => "test5   Pig"

ファイル名の-0末尾の は、出力を生成したレデューサーに対応します。レデューサーが複数ある場合は、ディレクトリごとに複数のファイルが表示されることがあります。

于 2012-07-28T01:34:03.090 に答える
0

PigStorage コードを拡張して、ファイル名をタプルに追加することができます。「Q: I load data from a directory which contains different file. How do I find out where the data comes from?」という質問のコード サンプルを参照してください。出力については、PigStorage の同様の拡張を行って、別の出力ファイルに書き込むことができます。

于 2012-07-12T10:26:42.743 に答える