У меня проблема с паркетными перегородками, которую я пытаюсь решить. Я прочитал много материалов о разделении на этом сайте и в Интернете, но все еще не могу объяснить свою проблему.
Шаг 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 и далее. Есть ли более эффективный способ сделать все это?
Спасибо