Pyspark使用S3A问题写出分区实木复合地板

时间:2020-01-13 16:22:22

标签: apache-spark pyspark

我有一个pyspark脚本,该脚本从s3读取未分区的单个镶木地板文件,进行一些转换,并按日期分区将其写回到另一个s3存储桶中。

我使用s3a进行读写。读入文件并执行转换是没有问题的。但是,当我尝试使用s3a写入s3并进行分区时,会引发以下错误:

WARN s3a.S3AFileSystem:找到的文件(带有/):真实文件?不应该 发生:folder1 /输出 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 个答案:

答案 0 :(得分:1)

您的存储桶s3a://bucket1/folder1/output/中有一个带斜线的条目,其大小>0。S3A警告说它是不满意的,因为它被视为空目录标记,一旦在下面添加文件,就有删除的危险。

  1. 从AWS控制台中查看S3存储桶,查看其中存在的内容并将其删除
  2. 尝试使用不带结尾/的output_loc,以查看是否有帮助(不太可能...)

对结果进行跟进;如果删除操作无法解决问题,那么值得一提的是Hadoop JIRA