我正在从 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/