разделение и повторное разделение паркетных файлов с помощью pyspark - PullRequest
0 голосов
/ 14 июля 2020

У меня проблема с паркетными перегородками, которую я пытаюсь решить. Я прочитал много материалов о разделении на этом сайте и в Интернете, но все еще не могу объяснить свою проблему.

Шаг 1: У меня есть большой набор данных (~ 2 ТБ), который имеет столбцы MODULE и DATE и разделен на DATE, состоящий из 86 days. Каждый раздел DATE имеет 21 файлов и, следовательно, всего 86 * 21 = 1806 файлов.

Шаг 2: Мне нужно было агрегировать данные на основе столбца MODULE, поэтому Загрузил, сохранил как еще один паркет, разбив на MODULE. Имеется 9 модулей, и каждый модуль содержит данные за все 86 дней, поэтому полученный паркет имел 9 * 1806 = 16254 файлов.

Шаг 3 Я загрузил каждый MODULE раздел через a для l oop, выполнил мои агрегации и сохранил его обратно как папку в режиме добавления, так что у меня есть 9 модулей в виде папок: s3://path/MODULE A/, s3://path/MODULE B et c. Они не разбиваются по модулям, а просто сохраняются в виде папок. Так как мои разделы по умолчанию были 201, каждая папка модуля имела 201 файлов и, таким образом, всего 9 * 201 = 1809 файлов

Шаг 4 Пока все хорошо, но мне нужно было разделить обратно на DATE. Итак, я перебрал каждый раздел MODULE и сохранил файл как один паркетный файл без каких-либо разделов. В результате получилось 2751 файлов. Я не знаю, как это рассчитывается.

Шаг 5 Затем я загрузил все неразмеченные файлы и сохранил их, разбив на DATE. В результате получилось около 39k файлов, каждый из которых имеет размер около 1,5 МБ. Итак, у меня огромное количество небольших файлов, и загрузка паркета или выполнение каких-либо операций с ними занимает очень много времени, например, groupBy et c.

Прочитав еще немного, Я попытался использовать repartition(1).partitionBy('DATE') в шаге 4 , чтобы уменьшить количество файлов, но к концу это не удалось. Я знаю, что делаю что-то не так, начиная с шага 4 и далее. Есть ли более эффективный способ сделать все это?

Спасибо

1 Ответ

1 голос
/ 14 июля 2020

Тогда ваша задача - найти правильное количество разделов.

Предположим, у вас есть данные за 86 дней, и вы хотите сохранить их с разбивкой по дате. Тогда вы должны знать, сколько файлов вы хотите создать в одном разделе.

Предположим, у вас есть 3 ГБ данных для каждой даты, тогда, вероятно, вам нужно как минимум 6 файлов в каждой папке даты.

Вы можете добиться этого как

df.repartition(6,'date').write.partitionBy('date')...

Теперь, если вы хотите ограничить количество записей в каждом файле, используйте свойство

df.repartition(6, 'date').write.option("maxRecordsPerFile", 10000).partitionBy('date')...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...