PySpark将DataFrame分区写入S3

时间:2018-08-09 06:13:48

标签: amazon-s3 pyspark apache-spark-sql

我一直试图对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/')

什么可能导致此问题?

1 个答案:

答案 0 :(得分:1)

我通过在火花提交中将aws-java-sdk:1.7.4aws-java-sdk:1.11.199升级到hadoop-aws:2.7.7hadoop-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