2012-12-04 20 views
9

私は豚のデータをExcelやSQL(またはRやSPSSなど)で多くの操作を行うことなく使用することができます...豚からCSVへのエクスポート

私は次の関数を使用して試してみた:

STORE pig_object INTO '/Users/Name/Folder/pig_object.csv' 
    USING CSVExcelStorage(',','NO_MULTILINE','WINDOWS'); 

それは一部-M-0000#ファイルの多くとその名前のフォルダを作成します。私は後でそれらをcat part *> filename.csvを使って結合することができますが、ヘッダーはありません。これは手動で入力する必要があることを意味します。

PigStorageSchemaはヘッダー付きの別のビットを作成する予定ですが、まったく動作しないようです。たとえば、格納されている場合と同じ結果が得られます。ヘッダーファイルはありません。 STORE pig_object INTO '/ユーザー/名前/フォルダ/ pig_object' USING org.apache.pig.piggybank.storage.PigStorageSchema();

(私はこれをローカルモードとmapreduceモードの両方で試しました)。

これらの複数の手順を実行せずにPigからデータを単純なCSVファイルに取り込む方法はありますか?

ご協力いただければ幸いです。

答えて

28

私は仕事をしていませんワンライナーがない怖いんだけど、あなたは以下の(豚v0.10.0)を思い付くことができます。

A = load '/user/hadoop/csvinput/somedata.txt' using PigStorage(',') 
     as (firstname:chararray, lastname:chararray, age:int, location:chararray); 
store A into '/user/hadoop/csvoutput' using PigStorage('\t','-schema'); 

PigStorageは「-schema」を取るとき、それは出力ディレクトリに '.pig_schema'と '.pig_header'が作成されます。その後、「part-x-xxxxx」で「.pig_header」をマージする必要があります。

1.結果はローカルディスクにコピーすることにより、必要がある場合:

hadoop fs -rm /user/hadoop/csvoutput/.pig_schema 
hadoop fs -getmerge /user/hadoop/csvoutput ./output.csv 

-getmergeは、あなたが取得する必要があります入力ディレクトリがかかるため

hadoop fs -cat /user/hadoop/csvoutput/.pig_header 
    /user/hadoop/csvoutput/part-x-xxxxx | 
    hadoop fs -put - /user/hadoop/csvoutput/result/output.csv 
:HDFS上の結果を格納する第1 .pig_schema

2.を取り除きますさらに参考のために

あなたはまた、これらの投稿を見ているかもしれません:
STORE output to a single CSV?
How can I concatenate two files in hadoop into one using Hadoop FS shell?

+0

おかげで非常に多くの、ロランシェルコマンドを呼び出すと、少し上の事が整理されます。しかし、-schema引数は、実行時に.pig_headerまたは.pig_schemaファイルを作成しません。私はPigStorageとPigStorageSchemaを使ってみました。私は豚0.10.0を実行しています。 – Saxivore

+0

こんにちは、これ以上... .pig_headerファイルが作成されましたが、それは隠されていて、私はそれを見ることができませんでした(私はまだシェルのもので作業することに慣れています)。だから、私はスクリプト内で素晴らしいことができる回避策があります。ありがとう! – Saxivore

+0

@Saxivore 'pig_object.'のスキーマをチェックします。もし存在しなければ、ヘッダファイルとスキーマファイルは作成されません。あなたはこの質問についてもう助けが必要ですか? –

1

あなたはHDFS上PigStorageとしてデータを格納し、-getmerge -nlを使用して、それをマージするかどうか:

STORE pig_object INTO '/user/hadoop/csvoutput/pig_object' 
    using PigStorage('\t','-schema'); 
fs -getmerge -nl /user/hadoop/csvoutput/pig_object /Users/Name/Folder/pig_object.csv; 

Docs:

オプションで、-nlを設定して、各ファイルの末尾に改行文字(LF)を に追加することができます。

あなたは、単一のTSV/CSVは、次のような構造を持つファイルがあります:私たちは、単にAWKを使ってライン[2,3,4]削除することができ

1 - header 
2 - empty line 
3 - pig schema 
4 - empty line 
5 - 1st line of DATA 
6 - 2nd line of DATA 
... 

:あなたの援助のための

awk 'NR==1 || NR>4 {print}' /Users/Name/Folder/pig_object.csv > /Users/Name/Folder/pig_object_clean.csv 
関連する問題