web-dev-qa-db-ja.com

Daskパーティションを単一のファイルに書き込む

daskを初めて使用しました。1GB CSVファイルをdaskデータフレームで読み取ると、ファイルに変更を加えた後、約50のパーティションが作成され、パーティションと同じ数のファイルが作成されます。
すべてのパーティションを単一のCSVファイルに書き込む方法はありますか?パーティションにアクセスする方法はありますか?
ありがとうございました。

21
rey

簡潔な答え

いいえ、Dask.dataframe.to_csvは、CSVファイルを異なるファイルに書き込むだけです(パーティションごとに1つのファイル)。ただし、これには回避策があります。

後で連結

おそらく、dask.dataframeがファイルを書き込んだ後にファイルを連結するだけでしょうか?これは、パフォーマンスの点で最適に近いと思われます。

_df.to_csv('/path/to/myfiles.*.csv')
from glob import glob
filenames = glob('/path/to/myfiles.*.csv')
with open('outfile.csv', 'w') as out:
    for fn in filenames:
        with open(fn) as f:
            out.write(f.read())  # maybe add endline here as well?
_

またはDask.delayedを使用します

ただし、これは dask.delayed を使用して自分で行うことができます dask.delayedをデータフレームと一緒に使用

これにより、使用できる遅延値のリストが表示されます。

_list_of_delayed_values = df.to_delayed()
_

その後、これらのパーティションを単一のファイルに順次書き込むように計算を構造化するのはあなた次第です。これは難しいことではありませんが、スケジューラで少しのバックアップを引き起こす可能性があります。

編集1:(2019年10月23日)

Dask 2.6.xでは、_single_file_というパラメーターがあります。デフォルトではFalseです。 Trueを設定すると、df.compute()を使用せずに単一のファイル出力を取得できます。

例えば:

_df.to_csv('/path/to/myfiles.csv', single_file = True)
_

リファレンス: to_csvのドキュメント

22
MRocklin

compute関数を使用して、daskデータフレームをpandasデータフレームに変換してから、to_csv。このようなもの:

df_dask.compute()。to_csv( 'csv_path_file.csv')

2