【问题标题】:Pyspark writing out to partitioned parquet using s3a issuePyspark 使用 s3a 问题写入分区镶木地板
【发布时间】:2020-04-30 09:18:35
【问题描述】:

我有一个 pyspark 脚本,它从 s3 读取未分区的单个 parquet 文件,进行一些转换并写回按日期分区的另一个 s3 存储桶。

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

WARN s3a.S3AFileSystem: Found file (with /): real file?不应该 发生:文件夹1/输出 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 的旧实例上运行良好。

谢谢

【问题讨论】:

  • 您是否尝试只给出没有 s3a 或 s3n 的 s3 路径?
  • 仅尝试 s3 时会出错,找不到文件系统。然而,这不是使用 s3a 写入 s3 时的问题,这是现在推荐的方法

标签: apache-spark pyspark


【解决方案1】:

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

  1. 从 AWS 控制台查看 S3 存储桶,看看里面有什么,删除它
  2. 尝试使用不带尾随 / 的 output_loc,看看是否有帮助(不太可能...)

添加对结果的跟进;如果删除不能解决问题,那么 hadoop JIRA 可能值得归档

【讨论】:

    猜你喜欢
    • 2023-03-05
    • 2021-03-15
    • 1970-01-01
    • 2019-10-13
    • 2021-06-22
    • 1970-01-01
    • 2016-09-03
    • 2018-10-27
    • 2018-11-14
    相关资源
    最近更新 更多