Эффективное использование напитка с паркетными файлами - PullRequest
1 голос
/ 30 сентября 2019

Я получил огромный (140MM записей) набор данных, и Dask пригодился, но я не уверен, смогу ли я сделать лучше. Представьте, что записи в основном числовые (два столбца являются датами), поэтому процесс преобразования из CSV в паркет был быстрым (dask.dataframe.read_csv ('in.csv'). To_parquet ('out.pq')), но

(i) Я хотел бы использовать данные на Amazon Athena, так что один паркетный файл был бы хорош. Как этого добиться? Dask сохранил его в виде сотен файлов. (ii) Для исследовательского анализа данных, который я пробую с этим набором данных, есть определенные операции, в которых мне нужно больше, чем пара переменных, которые не помещаются в память, поэтому я постоянно выкидываю представления с двумя / тремя переменными вSQL, этот код эффективно использует dask?

mmm = ['min','mean','max']
MY_COLUMNS = ['emisor','receptor','actividad', 'monto','grupo']
gdict = {'grupo': mmm, 'monto': mmm, 'actividad': ['mean','count']}

df = dd.read_parquet('out.pq', columns=MY_COLUMNS).groupby(['emisor','receptor']).agg(gdict)
df = df.compute()
df.columns = ['_'.join(c) for c in df.columns]  # ('grupo','max') -> grupo_max
df.to_sql('er_stats',conn,index=False,if_exists='replace')

Чтение файла занимает около 80, а запись в SQL - около 60 секунд.

1 Ответ

2 голосов
/ 30 сентября 2019

Чтобы уменьшить количество разделов, вы должны либо установить размер блока при чтении CSV (предпочтительно), либо переразбить перед написанием паркета. «Лучший» размер зависит от вашей памяти и количества рабочих, но один раздел, вероятно, невозможен, если ваши данные «огромны». Поместить много разделов в один файл также невозможно (или, скорее, не реализовано), потому что dask записывает параллельно, и не было бы никакой возможности узнать, где в файле находится следующая часть, прежде чем предыдущая часть будет закончена. Я мог бы представить написание кода для чтения в последовательных частях, созданных в виде dask, и потоковую передачу их в один вывод, это будет не сложно, но, возможно, и не тривиально.

запись в SQL около 60 секунд

Это говорит о том, что ваш вывод все еще довольно велик. Является ли SQL лучшим вариантом здесь? Возможно, можно будет снова записать файлы паркета.

...