Pyspark выписывает разделенный паркет с использованием проблемы s3a

У меня есть сценарий pyspark, который читает в s3 непаретированный файл одного партера, выполняет некоторые преобразования и записывает обратно в другой сегмент s3 с разбивкой по дате.

Я использую s3a для чтения и записи. Чтение в файлах и выполнение преобразований - это нормально и никаких проблем. Тем не менее, когда я пытаюсь записать в s3 с помощью s3a и разделить его, выдает следующую ошибку:

WARN s3a.S3AFileSystem: Найденный файл (с /): реальный файл? не должно происходить: папка1 / output org.apache.hadoop.fs.FileAlreadyExistsException: невозможно создать каталог для пути 's3a: // bucket1 / folder1 / output', поскольку это файл.

Часть кода, которую я использую для записи, выглядит следующим образом, где я пытаюсь добавить существующий каталог, но новый раздел для новой даты:

output_loc = "s3a://bucket1/folder1/output/"

finalDf.write.partitionBy("date", "advertiser_id") 
.mode("append") 
.parquet(output_loc)

Я использую Hadoop v3.0.0 и Spark 2.4.1

Кто-нибудь сталкивался с этой проблемой при использовании s3a вместо s3n. Кстати, он отлично работает на более старом экземпляре с использованием s3n.

Благодарность

Всего 1 ответ


В вашем ведре есть запись s3a://bucket1/folder1/output/ с s3a://bucket1/folder1/output/ косой чертой, размер которой> 0. S3A предупреждает, что он недоволен, поскольку рассматривается как маркер пустого каталога, который подвергается риску удаления после добавления файлы внизу.

  1. Посмотрите на ведро S3 с консоли AWS, посмотрите, что там есть, удалите его
  2. попробуйте использовать output_loc без завершающего /, чтобы увидеть, помогает ли это (маловероятно ...)

Добавить продолжение на результат; если удаление не исправляет вещи, тогда стоит подать Joop Jadoop


Есть идеи?

10000