Агрегирование разбросанных файлов в Spark - PullRequest
1 голос
/ 15 апреля 2020

У меня есть задание, которое ежедневно принимает данные в секционировании S3 по указанному полю c, например:

...
result_df.write.partitionBy("my_field").parquet("s3://my/location/")

Этот процесс приема будет записывать в уже существующие разделы каждый день, добавляя файлы содержащий одну или несколько записей. Я хочу подчеркнуть, что это будет происходить каждый день: со временем это создаст много маленьких файлов, которые все ненавидят. Вы, вероятно, скажете мне, что это не лучшее поле для разбиения, но это поле, необходимое для бизнеса.

Поэтому я подумал запустить другую работу, которая проверяет разделы, содержащие слишком много файлов, и объединяет их на ежедневно. Но, к сожалению, я не могу придумать эффективный способ объединения этих файлов с помощью Spark. Единственное решение, которое мне пришло в голову, это

  1. чтение раздела со слишком большим количеством маленьких файлов
  2. перераспределение и запись результатов в папку поддержки
  3. удалить источник раздел
  4. переместить данные, сгенерированные на шаге 2, в исходный раздел

Мне очень не нравится идея перемещения данных много раз, и я считаю ее неэффективной. В идеале нужно сгруппировать все файлы в одном разделе по меньшему количеству, но с помощью Spark это мне не представляется возможным.

Существуют ли передовые практики в отношении этого варианта использования? Или какое-либо улучшение предложенного процесса?

...