7

次のような豚のラテン文字を書いています。

A = load 'data' using PigStorage('\t');
store A into my_data using PigStorage();

これは出力します

(Bob, 10, 4.0)
(Jim, 11, 3.25)
(Paul, 9, 2.75)

HDFS に保存されている各ファイルに最初のヘッダー行を追加したい

(Name, Age, GPA)
(Bob, 10, 4.0)
(Jim, 11, 3.25)
(Paul, 9, 2.75)

何か案は?

4

4 に答える 4

15

CSVExcelStorageをストレージ関数として使用すると、必要なことを正確に行うことができます。

STORE 出力 INTO '/outputfolder/' USING org.apache.pig.piggybank.storage.CSVExcelStorage('\t', 'NO_MULTILINE', 'UNIX', 'WRITE_OUTPUT_HEADER');

「WRITE_OUTPUT_HEADER」オプションを使用すると、ユースケースを満たすすべてのファイルにヘッダーが書き込まれます。

于 2015-07-01T07:55:40.233 に答える
11

これは、Pig にはあまり意味がありません。各行はデータの個別のレコードであるためName、年齢がAgeで GPA が である という名前の人が実際に存在しない限りGPA、そのような行を持つことは誤りです。また、Pig はフィールドが出力される順序について保証しないため (を使用しない限りORDER BY)、ヘッダー行がどこにでも表示される可能性があります。

あなたが求めているのは、Pig が作業を完了した後もスキーマを維持する方法です。これにより、それが何であるかを覚えたり、どこかで調べたりする必要がなくなります。PigStoragePig 0.10 から、リレーションのスキーマを JSON ファイル .pig_schema として出力と同じディレクトリに保存することで、これが可能になりました。それが何であるか、そしてそれをどのように使用するかについてのより詳細な情報については、このページを参照してください。

于 2013-01-07T22:56:36.073 に答える
0

あなたの最善の策は、Gruntシェルのテストセットで出力しようとしている関係を記述し、それをコピーして、ファイルの先頭にレコードを追加するbashコマンドなどに貼り付けることだと思います-get it HDFS からフラット ファイルに cat します。次のようなものです:

sed -i '1s/^/(Name, Age, GPA) /' filename.tsv

(書かれているように、これはその場で書き込むので、シェルコマンド n00b の場合は、出力を新しいファイルに直接出力することに注意してください。)

于 2013-10-09T18:31:52.197 に答える