使用dask合并数据集证明不成功

时间:2018-11-14 16:57:43

标签: python merge concatenation dask dask-delayed

我正在尝试使用Python中的Dask合并许多大型数据集,以避免加载问题。我想将合并文件另存为500..<1000。任务比想象的要难:

我整理了一个玩具示例,其中仅包含两个数据集 然后,我使用的代码如下:

let iterations = 2  

DispatchQueue.concurrentPerform(iterations: iterations) { index in

    // First iteration would start at 0 whereas second (index = 1) starts at 500
    let start = index * source.count / iterations

    // First and second iterations will have 500 and 1000 upper bounds respectively 
    let end = (index + 1) * source.count / iterations

    for i in start..<end {
        // Do stuff to get the i'th element
        copy[i] = UInt32.random(in: 0..<source.count)
    }
}

如果我使用.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')合并数据集是否已成功创建。

1 个答案:

答案 0 :(得分:0)

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

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

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

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

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