Python 将Dask分区写入单个文件

Python 将Dask分区写入单个文件,python,dask,Python,Dask,作为dask的新手,我在dask数据帧中读取了一个1GBCSV文件,它创建了大约50个分区。在我写入文件时对文件进行更改后,它创建的文件与分区的数量一样多。 是否有办法将所有分区写入单个CSV文件,是否有办法访问分区? 谢谢。简短回答 不,Dask.dataframe.to_csv只将csv文件写入不同的文件,每个分区一个文件。然而,有办法解决这个问题 之后连接 也许只是在dask.dataframe写入文件后连接这些文件?就性能而言,这可能接近最优 df.to_csv('/path/to/my

作为
dask
的新手,我在
dask
数据帧中读取了一个
1GB
CSV文件,它创建了大约50个分区。在我写入文件时对文件进行更改后,它创建的文件与分区的数量一样多。
是否有办法将所有分区写入单个CSV文件,是否有办法访问分区?
谢谢。

简短回答 不,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 但是,您可以自己使用,通过

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

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)

参考资料:

您可以使用
compute
功能将dask数据帧转换为熊猫数据帧,然后使用
转换为csv
。大概是这样的:

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


感谢您的回复。在未来的版本中是否有任何选项可以直接执行。另一个快速问题是,如果我在转换为pandas datafrme后进行计算,那么它是否会将数据加载到内存中?如果您在dask.dataframe上调用
.compute()
,那么您将得到一个pandas dataframe。如果您使用dask.delayed,那么一切都将是懒惰的。我喜欢简单、直观、实用和干净的代码。:-)但在这种情况下,您可以使用pandas,因为df必须适合内存。