首页 > 解决方案 > 使用 dask 合并数据集被证明是不成功的

问题描述

我正在尝试在 Python 中使用 Dask 合并许多大型数据集,以避免加载问题。我想保存为.csv合并文件。事实证明,这项任务比想象的要难:

我用两个数据集组合了一个玩具示例然后我使用的代码如下:

import dask.dataframe as dd
import glob
import os

os.chdir('C:/Users/Me/Working directory')
file_list = glob.glob("*.txt")    

dfs = []
for file in file_list:
    ddf = dd.read_table(file, sep=';')
    dfs.append(ddf)

dd_all = dd.concat(dfs)

如果我使用dd_all.to_csv('*.csv'),我只需打印出两个原始数据集。如果我使用dd_all.to_csv('name.csv')我会收到一条错误消息,指出该文件不存在。( FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\Me\\Working directory\\name.csv\\1.part')

我可以检查是否dd_all.compute()已成功创建使用合并数据集。

标签: pythonmergeconcatenationdaskdask-delayed

解决方案


您误解了 Dask 的工作原理 - 您看到的行为符合预期。为了能够从多个worker并行写入,每个worker都必须能够写入单独的文件;例如,在写入完成之前无法知道第一个块的长度。因此,写入单个文件必然是一个顺序操作。

因此,默认操作是为每个输入分区写入一个输出文件,这就是您所看到的。由于 Dask 可以并行读取这些文件,因此确实提出了一个问题,即您为什么要创建一个输出文件。

对于没有“*”字符的第二种方法,Dask 假设您提供的是目录,而不是文件,并尝试在该目录中写入两个文件,但该目录不存在。

如果您真的想编写单个文件,可以执行以下操作之一:

  • 使用 repartition 方法制作单个输出片段,然后使用 to_csv
  • 编写单独的文件并在事后将它们连接起来(注意标题行)
  • 依次遍历数据帧的分区以写入同一个文件。

推荐阅读