我有一个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的旧实例上可以正常工作。
谢谢
答案 0 :(得分:1)
您的存储桶s3a://bucket1/folder1/output/
中有一个带斜线的条目,其大小>0。S3A警告说它是不满意的,因为它被视为空目录标记,一旦在下面添加文件,就有删除的危险。
对结果进行跟进;如果删除操作无法解决问题,那么值得一提的是Hadoop JIRA