要求是使用PySpark将 csv 和 parquet 文件从S3加载到 Dataframe 中。
我使用的代码是:
from pyspark import SparkConf, SparkContext
from pyspark.sql import SparkSession
conf = SparkConf()
appName = "S3"
master = "local"
conf.set('spark.executor.extraJavaOptions', '-Dcom.amazonaws.services.s3.enableV4=true')
conf.set('spark.driver.extraJavaOptions', '-Dcom.amazonaws.services.s3.enableV4=true')
sc = SparkContext.getOrCreate(conf=conf)
sc.setSystemProperty('com.amazonaws.services.s3.enableV4', 'true')
hadoopConf = sc._jsc.hadoopConfiguration()
hadoopConf.set('fs.s3a.access.key', aws_access_key_id)
hadoopConf.set('fs.s3a.secret.key', aws_secret_access_key)
hadoopConf.set('fs.s3a.impl', 'org.apache.hadoop.fs.s3a.S3AFileSystem')
spark = SparkSession(sc)
df = spark.read.csv('s3://s3path/File.csv')
它给了我错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o34.csv.
: java.lang.NoClassDefFoundError: org/jets3t/service/S3ServiceException
阅读Parquet文件时出现类似错误:
py4j.protocol.Py4JJavaError: An error occurred while calling o34.parquet.
: java.lang.NoClassDefFoundError: org/jets3t/service/S3ServiceException
如何解决这个问题?
2条答案
按热度按时间jljoyd4f1#
1.如果有人在寻找jets 3 t,那么您使用的是历史上过时的hadoop版本,它实际上支持s3://url
1.升级到带有Hadoop-3. 3. 4或更高二进制文件的Spark版本(无论阅读时是什么最新版本)
1.包括与hadoop-awsjar在其构建中所依赖的完全相同的aws-sdk-bundlejar。
1.删除
hadoopConf.set('fs.s3a.impl', ...
行,因为这是堆栈溢出帖子流传下来一个奇怪的迷信。注意Spark和Hadoop文档示例都没有使用它,并认为那里的作者知道他们写了什么。1.然后使用s3 a://URL
eit6fx6z2#
您缺少Hadoop客户端依赖项-Caused by: java.lang.ClassNotFoundException: org.jets3t.service.ServiceException
注-对AWS S3://的支持已于2016年删除,如stevel所述,您应选择最新的
s3a
,您可以参考以下链接进行设置在尝试从S3读取数据源之前,您需要确保存在其他相关库
您可以将此答案作为参考- java.io.IOException:没有用于方案的文件系统:s3相应地设置环境