Объединение наборов данных с использованием dask оказывается неудачным

Я пытаюсь объединить несколько больших наборов данных, используя Dask в Python, чтобы избежать проблем с загрузкой. Я хочу сохранить как .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() объединенный набор данных был успешно создан.

1 ответ

Вы не понимаете, как работает Dask - поведение, которое вы видите, соответствует ожиданиям. Чтобы иметь возможность записи из нескольких рабочих параллельно, каждому рабочему необходимо иметь возможность записи в отдельный файл; например, нет способа узнать длину первого фрагмента до того, как запись будет закончена. Поэтому запись в один файл обязательно является последовательной операцией.

Следовательно, операция по умолчанию - записать один выходной файл для каждого входного раздела, и это то, что вы видите. Поскольку Dask может читать из них параллельно, возникает вопрос, почему вы вообще хотите создать один выходной файл.

Для второго метода без символа "*" Dask предполагает, что вы предоставляете каталог, а не файл, и пытается записать два файла в этом каталоге, который не существует.

Если вы действительно хотите написать один файл, вы можете выполнить одно из следующих действий:

  • используйте метод перераспределения, чтобы сделать один выходной фрагмент, а затем to_csv
  • написать отдельный файл и объединить их после факта (заботясь о строке заголовка)
  • перебирайте разделы вашего фрейма данных последовательно, чтобы записать в тот же файл.
Другие вопросы по тегам