我一直试图对Spark数据帧进行分区并将其写入S3,但出现错误。
df.write.partitionBy("year","month").mode("append")\
.parquet('s3a://bucket_name/test_folder/')
错误消息是:
Caused by: com.amazonaws.services.s3.model.AmazonS3Exception:
Status Code: 403, AWS Service: Amazon S3, AWS Request ID: xxxxxx,
AWS Error Code: SignatureDoesNotMatch,
AWS Error Message: The request signature we calculated does not match the signature you provided. Check your key and signing method.
但是,当我只写而没有分区时它确实起作用。
df.write.mode("append").parquet('s3a://bucket_name/test_folder/')
什么可能导致此问题?
答案 0 :(得分:1)
我通过在火花提交中将aws-java-sdk:1.7.4
从aws-java-sdk:1.11.199
升级到hadoop-aws:2.7.7
到hadoop-aws:3.0.0
来解决了这个问题。
我使用以下命令在python文件中设置了此
:os.environ['PYSPARK_SUBMIT_ARGS'] = '--packages com.amazonaws:aws-java-sdk:1.11.199,org.apache.hadoop:hadoop-aws:3.0.0 pyspark-shell
但是您也可以提供它们作为直接提交火花的参数。
我不得不重建Spark以提供自己的Hadoop 3.0.0版本,以避免依赖冲突。
您可以在这里阅读我对根本原因的一些推测:https://stackoverflow.com/a/51917228/10239681