2017-02-04 7 views
13

寄木細工データを書き込むには、次のようにします。しかし、複数のファイルに出力しようとすると、単一の列を読み込んでもすべてのs3データが読み込まれないので、どうすればこのことができますか?例えば寄木細工で複数のs3ファイルを出力する方法

AvroParquetWriter<GenericRecord> writer = 
      new AvroParquetWriter<GenericRecord>(file, schema); 

    GenericData.Record record = new GenericRecordBuilder(schema) 
       .set("name", "myname") 
       .set("favorite_number", i) 
       .set("favorite_color", "mystring").build(); 
    writer.write(record); 

私は赤のfavorite_colorを持つすべてのデータは、特定のクエリのコストを最小化するために、1つのファイルや他のファイル内の青色のものになりますように、列の値でパーティションを作成する場合。 Hadoopの文脈には何か類似したものがあるはずです。私は見つけることができるすべては

df.write.parquet("hdfs:///my_file", partitionBy=["created_year", "created_month"]) 

のようなものを使用してSparkを言及しかし、私はHadoopの持つ純粋なJavaでpartitionByに相当するものを見つけることができませんものです。

+0

、NativeS3FileSystemのHadoopのの実装はS3filesに(部分コンテンツの読み取り)追求をサポートしていません。最初にファイル全体をダウンロードします。 –

+0

しかし、これを見てみるといいかもしれません:http://blog.cask.co/2015/10/multiple-outputs-in-cdap/ そこには、「CDAPの新機能では、今ではCDAPのMapReduceプログラムを使用して、出力がS3のParquetファイルかTableデータセットかどうかにかかわらず、複数の出力に書き込むことができます」 –

+0

これを行うコードを書いていますが、HDFSシステムclouderaまたはhortonディストリビューション。あなたはそれらの間にどのような違いがあるのか​​分かりますか? – hlagos

答えて

0

S3 toolkitを使用して、私のレデューサーメソッドから出力をS3に直接書き込むことでこれを行いました。私はEC2で動作していたので、これは素早く無料でした。

一般的には、クリーナーマッパーとレデューサーのためにできるだけ入力と出力を処理したいと思っています。もちろん、パイプラインの最後にS3に書き込んで、Hadoopのコードを動かすようにしてください。HDFS

いずれの場合も、すべてのデータパーティション化と出力全体の書き込みをお勧めします最終的な削減タスクではS3に設定され、S3ファイルにつき1セットになります。これはできるだけあなたのコードにライターロジックをほとんど入れません。これは、私がいくつかのタスクフローに使用した最小限のHadoop S3ツールキットで終わったため、私にとって有益でした。

1

典型的なMap-Reduceアプリケーションでは、出力ファイルの数はジョブの削減数と同じになります。あなたが複数の出力ファイルをしたいのであれば、数を設定しそれに応じて削減:システムプロパティを経由して

job.setNumReduceTasks(N);

または代わり:

-Dmapreduce.job.reduces=N

私はそれを持っていることが可能であるとは思いませんファイルごとに1つの列をParquet形式で指定します。 Parquetファイルの内部構造は、最初は行グループによって分割され、これらの行グループのみが列で分割されます。私の知る限りでは

Parquet format

関連する問題