web-dev-qa-db-ja.com

S3でsparkdataframeを.csvファイルに書き込み、pysparkで名前を選択します

データフレームがあり、S3で.csvファイルを作成します。次のコードを使用します。

df.coalesce(1).write.csv("dbfs:/mnt/mount1/2016//product_profit_weekly",mode='overwrite',header=True)

.csvファイルをproduct_profit_weeklyフォルダーに配置しますが、S3で.csvファイルの名前が変わった時点で、書き込むときにファイル名を選択することはできますか?

6
chessosapiens

すべてのsparkデータフレームライター(df.write .___)は、単一のファイルに書き込むのではなく、パーティションごとに1つのチャンクを書き込みます。取得するディレクトリは次のようになります。

df.coalesce(1).write.csv("dbfs:/mnt/mount1/2016//product_profit_weekly

と呼ばれる内部の1つのファイル

part-00000

この場合、非常に非効率的で「スパーク」ではない可能性のあることを実行しています。つまり、すべてのデータフレームパーティションを1つにまとめているため、タスクは実際には並行して実行されません。

これは別のモデルです。すべてのspark並列化を利用するには、これは合体しないことを意味し、あるディレクトリに並列に書き込みます。

100個のパーティションがある場合、次のようになります。

part-00000
part-00001
...
part-00099

1つのフラットファイルにすべてが必要な場合は、事後にそれをマージする小さな関数を記述します。これは、scalaで行うか、bashで次のように行うことができます。

cat ${dir}.part-* > $flatFilePath
4
Tim