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