amazon-s3 - EMR 到 S3 文件写入出现错误 java.net.URISyntaxException : Relative path in absolute URI

标签 amazon-s3 amazon-emr

我正在从 EMR 集群运行 pyspark 应用程序。我有两个存储桶 - 一个输入数据存储桶用户数据输入和一个o/p数据存储桶来存储脚本结果电影统计。我的写入输出存储桶的代码

final_df = ratings.join(movie_title, 'movieId', 'left') \
    .select('movieId', 'title', 'release_year', 'avg_rating', 'ratings_count', 'distinct_viewers') \
    .coalesce(1)
final_df.write.csv('s3://movie-stats', header=True, mode='overwrite')

我的电影统计存储桶策略如下。

{
    "Version": "2012-10-17",
    "Id": "Policy1606478144619",
    "Statement": [
        {
            "Sid": "Stmt1606478053538",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:PutObject",
            "Resource": [
                "arn:aws:s3:::movie-stats/*",
                "arn:aws:s3:::movie-stats"
            ]
        }
    ]
}

我的脚本可以从 S3 存储桶读取数据并运行分析,但在尝试写入 S3 时抛出错误

java.net.URISyntaxException: Relative path in absolute URI: s3://movie-stats.spark-staging-f2e2ecd7-5c42-483a-888c-6a6295b76c0d

我不明白这个错误,也没有从 google 找到太多信息来理解如何在输出中提及 S3 路径。

最佳答案

我发现这段代码有问题。 Spark 应用程序需要不存在的输出文件夹。因此输出存储桶 s3://movie-stats 已经存在。所以解决办法就是添加一个bucket路径s3://movie-stats/output。

其次,通过文件覆盖写入 S3 存在问题。所以最终的代码修复是

final_df.write.csv('s3://movie-stats/output', header=True)

如果再次运行脚本,则需要先删除该文件夹,然后才能再次加载数据。引用这个AWS EMR Spark: Error writing to S3 - IllegalArgumentException - Cannot create a path from an empty string用于删除文件的Python代码。

关于amazon-s3 - EMR 到 S3 文件写入出现错误 java.net.URISyntaxException : Relative path in absolute URI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65044474/

相关文章:

java - AWS S3 - 仅列出根级对象

java - 如何使用java代码设置amazon ami的hadoop配置

hadoop - Spark EMR S3 处理大量文件

c# - 如何在查询中将 .net DateTime.Ticks 转换为 Hive DateTime?

amazon-web-services - 带有 AWS S3 文件的 Icecast 服务器

python - 无法使用boto连接aws s3 bucket

java - AWS Lambda/Aws Batch 工作流程

swift - 在 Swift 5 中从 AWS S3 下载文本文件

hadoop - 配置单元查询错误java.lang.RuntimeException:org.apache.hadoop.hive.ql.metadata.HiveException

apache-spark - 尝试通过 ssh 连接到 Amazon EMR Spark 集群时出现“操作超时”错误