Объединение наборов данных с использованием dask оказывается неудачным - PullRequest
0 голосов
/ 14 ноября 2018

Я пытаюсь объединить несколько больших наборов данных, используя 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 Ответ

0 голосов
/ 18 ноября 2018

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

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

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

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

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