У меня есть задание, которое ежедневно принимает данные в секционировании S3 по указанному полю c, например:
...
result_df.write.partitionBy("my_field").parquet("s3://my/location/")
Этот процесс приема будет записывать в уже существующие разделы каждый день, добавляя файлы содержащий одну или несколько записей. Я хочу подчеркнуть, что это будет происходить каждый день: со временем это создаст много маленьких файлов, которые все ненавидят. Вы, вероятно, скажете мне, что это не лучшее поле для разбиения, но это поле, необходимое для бизнеса.
Поэтому я подумал запустить другую работу, которая проверяет разделы, содержащие слишком много файлов, и объединяет их на ежедневно. Но, к сожалению, я не могу придумать эффективный способ объединения этих файлов с помощью Spark. Единственное решение, которое мне пришло в голову, это
- чтение раздела со слишком большим количеством маленьких файлов
- перераспределение и запись результатов в папку поддержки
- удалить источник раздел
- переместить данные, сгенерированные на шаге 2, в исходный раздел
Мне очень не нравится идея перемещения данных много раз, и я считаю ее неэффективной. В идеале нужно сгруппировать все файлы в одном разделе по меньшему количеству, но с помощью Spark это мне не представляется возможным.
Существуют ли передовые практики в отношении этого варианта использования? Или какое-либо улучшение предложенного процесса?