#amazon-s3 #pyspark #parquet
#amazon-s3 #pyspark #parquet
Вопрос:
Я написал программу pyspark , которая считывает данные из cassandra и записывает их в aws s3 . Перед записью в s3 я должен выполнить перераспределение (1) или объединение (1), поскольку это создает один единственный файл, в противном случае в s3 создается несколько файлов parquet. использование перераспределения (1) или объединения (1) имеет проблемы с производительностью, и я чувствую, что создание одного большого раздела не является хорошим вариантом с огромными данными. каковы способы создания одного отдельного файла в s3, но без ущерба для производительности?
Комментарии:
1. если вам нужен только один выходной файл, вы можете использовать coalesce (1), с другой стороны, вы можете использовать перераспределение (n), если вы хотите получить n количество файлов-частей четного размера, в идеале размер вашего выходного файла (файлов) должен составлять от 128 МБ до 1 ГБ в диск для Spark, чтобы эффективно обработать их при следующем чтении.
Ответ №1:
coalesce(1)
или repartition(1)
поместит все ваши данные в 1 раздел (с шагом перемешивания при использовании repartition
compare to coalesce
). В этом случае только 1 работнику придется записывать все ваши данные, что является причиной проблем с производительностью — вы уже поняли это.
Это единственный способ использовать Spark для записи 1 файла на S3. В настоящее время другого способа нет, используя только Spark.
Используя Python (или Scala), вы можете делать некоторые другие вещи. Например, вы записываете все свои файлы с помощью spark без изменения количества разделов, а затем :
- вы получаете свои файлы с помощью python
- вы объединяете свои файлы как один
- вы загружаете этот файл на S3.
Он хорошо работает для CSV, но не так хорошо для файлов непоследовательного типа.