PySpark 2.2.0将DataFrame写入S3 AmazonServiceException类未找到

时间:2017-12-09 23:11:22

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

我正在尝试使用pyspark将Spark DataFrame写入S3。我正在使用Spark 2.2.0版。

sc = SparkContext('local', 'Test')
sc._jsc.hadoopConfiguration().set("fs.s3a.awsAccessKeyId", aws_key)
sc._jsc.hadoopConfiguration().set("fs.s3a.awsSecretAccessKey", aws_secret)
sc._jsc.hadoopConfiguration().set("fs.s3a.multipart.uploads.enabled", "true")

spark = sql.SparkSession \
.builder \
.appName("TEST") \
.getOrCreate()

sql_context = sql.SQLContext(sc, spark)
filename = 'gerrymandering'
s3_uri = 's3a://mybucket/{}'.format(filename)
print(s3_uri)
df = sql_context.createDataFrame([('1', '4'), ('2', '5'), ('3', '6')], ["A", "B"])
df.write.parquet(s3_uri)

我得到的追溯是:

File "/usr/lib/spark/python/lib/py4j-0.10.4-src.zip/py4j/protocol.py", line 319, in get_return_value
py4j.protocol.Py4JJavaError: An error occurred while calling o48.save.
: java.lang.NoClassDefFoundError: com/amazonaws/AmazonServiceException

我不确定但似乎存在jar依赖性错误。我尝试了hadoop-aws-X.jar的多个版本以及aws-java-sdk-X.jar,但它们都会产生同样的错误。

在撰写本文时,我的命令是:

spark-submit --jars hadoop-aws-2.9.0.jar,aws-java-sdk-1.7.4.jar test.py

有关如何解决此问题的任何想法NoClassDefFoundError

1 个答案:

答案 0 :(得分:0)

不要尝试使用Hadoop-aws JAR和AWS SDK。不同于它附带的; AWS SDK在版本之间变化太大。对于hadoop-2.9.0,您需要aws-java-sdk-bundle版本1.11.199

请参阅mvnrepo/hadoop-aws