Соединение экспорта и импорта между dask и vaex - PullRequest
0 голосов
/ 27 апреля 2020

Я работаю совместно с vaex и dask для некоторого анализа. В первой части анализа я выполняю некоторую обработку с dask.dataframe, и я собираюсь экспортировать вычисленный мной фрейм данных во что-то, что читает vaex. Я хочу экспортировать данные в отображаемый в память формат, такой как hdf или стрелка.

dask позволяет экспортировать в файлы hdf и паркет. Vaex позволяет импортировать как hdf и стрелка. Оба позволяют экспортировать и импортировать как csv-файлы, но я хочу избежать этого.

Пока у меня есть следующие опции (и проблемы):

  • Если я экспортирую в файл hdf5 Так как dask экспортирует файл в формате строки, но vaex читает его в формате столбца, файл не может быть импортирован (https://vaex.readthedocs.io/en/latest/faq.html).
  • Я могу экспортировать данные в паркет файлы, но я не знаю, как читать их из Vaex. Я видел какой-то ответ в SO, который превращает файлы в таблицу стрелок, но для этого требуется, чтобы таблица загружалась в память, чего я не могу, потому что таблица слишком велика, чтобы поместиться в память.

Конечно, я могу сделать экспорт в csv и загрузить его порциями в vaex, затем экспортировать его в hdf в виде столбца, но я не думаю, что это должно быть целью двух модулей для больших объектов.

Есть ли какая-либо опция, которую я пропускаю, и которая была бы совместима для "соединения" двух модулей без загрузки полной таблицы в память или без необходимости чтения / записи набора данных дважды?

1 Ответ

0 голосов
/ 28 апреля 2020

Чтобы открыть паркет с помощью vaex, вы должны использовать vaex.open, а расширение вашего файла должно быть паркетным.

Создать данные

fldr = "test"
os.makedirs(fldr, exist_ok=True)

n = 1_000
for i in range(10):
    fn = f"{fldr}/file{i}.parquet"
    df = pd.DataFrame(np.random.randn(n, 2), columns=["a", "b"])
    df["key"] = np.random.randint(0, high=100, size=n)
    df.to_parquet(fn, index=False)

Пример: агрегирование и сохранение с помощью dask

df = dd.read_parquet(fldr)
grp = df.groupby("key").sum()
grp.to_parquet("output")

Читать с помощью vaex

df = vaex.open("output/part.0.parquet")
...