将 Dask 分区写入单个文件

Posted

技术标签:

【中文标题】将 Dask 分区写入单个文件【英文标题】:Writing Dask partitions into single file 【发布时间】:2017-01-26 18:25:34 【问题描述】:

dask 的新手,当我在dask 数据框中读取它时,我有一个1GB CSV 文件,它在我写入文件时创建了大约 50 个分区,它创建的文件与分区一样多。有没有办法将所有分区写入单个 CSV 文件,有没有办法访问分区? 谢谢。

【问题讨论】:

【参考方案1】:

简答

不,Dask.dataframe.to_csv 仅将 CSV 文件写入不同的文件,每个分区一个文件。但是,有一些方法可以解决这个问题。

之后连接

也许只是在 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 自己完成此操作,using dask.delayed alongside dataframes 提供

这为您提供了一个延迟值列表,您可以随意使用它们:

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)

参考:Documentation for to_csv

【讨论】:

感谢您的回复,在以后的版本中我们可以直接执行此操作。 另一个快速的问题,如果我在将所有内容转换为 pandas datafrme 之后进行计算,那么它是否会将数据加载到内存中? 如果您在 dask.dataframe 上调用 .compute(),那么您将获得一个 pandas 数据框。如果你使用 dask.delayed 那么一切都会变得懒惰。【参考方案2】:

您可以使用compute 函数将您的dask 数据帧转换为pandas 数据帧,然后使用to_csv。像这样:

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

【讨论】:

我喜欢简单、直观、实用和干净的代码。 :-) 但在这种情况下,您可以只使用 pandas,因为 df 必须适合内存。

以上是关于将 Dask 分区写入单个文件的主要内容,如果未能解决你的问题,请参考以下文章

在 S3 中将每个分区数据写入单个文件中

将Dask包的Pandas DataFrame转换为单个Dask DataFrame

使用 to_parquet() 将 dask 数据帧写入镶木地板结果“RuntimeError:文件元数据仅在写入器关闭后可用”

使用 dask.dataframe 从 CSV 文件中按分区读取尾部

如何并行处理数据但将结果写入 Spark 中的单个文件

在单个多核机器上索引大型 dask 数据帧时的内存使用情况