Пользовательский формат файла для разделения данных во время записи - PullRequest
0 голосов
/ 29 мая 2019

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

Я попытался расширить TextBasedFileFormat и изменить средство записи в соответствии со своими потребностями. Во время записи в файл данные разбиваются на разделы без перемешивания. Но я чувствую, что каждый раздел rdd будет записывать данные в отдельный файл детали

1 Ответ

1 голос
/ 29 мая 2019

Когда вы пишете фрейм данных, каждый раздел базового RDD будет записываться отдельными задачами.Теперь каждый из этих разделов RDD может соответствовать данным, которые принадлежат разным ключам разделов.Таким образом, каждая задача в конечном итоге создаст несколько файлов деталей.

Чтобы решить эту проблему, вы должны переразметить ваш фрейм данных разделом Keykey.Это будет включать случайное перемешивание, и все данные, соответствующие одному и тому же ключу partitionKey, попадут в один и тот же раздел RDD.Это может быть сделано с помощью -

val newDf = df.repartition("partitionKey")

Теперь этот RDD может быть записан в любой формат файла (например, паркет, CSV и т. Д.), И их должен быть 1 файл на раздел.Если размер файла становится большим, он может создать несколько файлов.Это можно контролировать с помощью конфигурации "spark.sql.files.maxRecordsPerFile".

val newDf = df.repartition("partitionKey")
newDf.write.partitionBy("partitionKey").parquet("<directory_path>")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...