Как можно объединить небольшие файлы паркета, используя Python на одном компьютере? - PullRequest
1 голос
/ 06 февраля 2020

У меня есть файл CSV 24 ГБ (~ 26 столбцов), который я хочу преобразовать в формат Parquet. Из онлайн-исследований я узнал, что для лучшей производительности рекомендуемый размер файла Parquet составляет от 128 МБ до 1 ГБ при запросах с Amazon Athena.

Следующий код эффективно преобразует CSV в несколько сотен 6-13 МБ Параллельные файлы паркета:

import dask.dataframe as dd

dd.read_csv('input_24GB.csv', dtype=object).to_parquet('output_folder')

Чтобы контролировать размер вывода, я использовал параметр blocksize в dd.read_csv():

dd.read_csv('input_24GB.csv', dtype=object, blocksize=1e9).to_parquet('output_folder')

К сожалению, нет точного способа предсказать, какой будет выходной размер файла Parquet для указанного c размера блока. Затем я попытался проверить, смогу ли я объединить все несколько сотен файлов Parquet 6-13 МБ в большие файлы Parquet, чтобы они имели размер не менее 128 МБ. Единственное решение, которое я придумал, работает серийно.

Есть ли лучший и более быстрый способ выполнить всю эту задачу с ограниченными ресурсами вычислений / памяти на ноутбуке?

Ответы [ 2 ]

1 голос
/ 07 февраля 2020

Я думаю, вы можете использовать ключевое слово partition_size :

df = dd.read_csv('input_24GB.csv', dtype=object)
df = df.repartition(partition_size='1GB')
df.to_parquet('output_folder')
1 голос
/ 06 февраля 2020

blocksize будет только контролировать размер входных данных, нет способа напрямую контролировать размер паркетных файлов, которые вы пишете. Однако вы можете посмотреть на количество разделов и текущие размеры файлов, чтобы получить приличную оценку количества разделов, которые вы должны использовать, чтобы получить размеры файлов, которые вы хотите. Например, если в настоящее время вы получаете 200 разделов, вы можете сначала перераспределить ваш фрейм данных до 10, прежде чем записывать файлы паркета:

dd.read_csv('input_24GB.csv', dtype=object, blocksize=1e9)
.repartition(npartitions=10)
.to_parquet('output_folder')
...