使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧

Posted

技术标签:

【中文标题】使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧【英文标题】:Read a folder of parquet files from s3 location using pyspark to pyspark dataframe 【发布时间】:2019-10-11 11:57:01 【问题描述】:

我想将 s3 存储桶 myBucketName 上的文件夹 poc/folderName 中的一些镶木地板文件读取到 pyspark 数据帧。我正在使用 pyspark v2.4.3。

下面是我正在使用的代码

    sc = SparkContext.getOrCreate()
    sc._jsc.hadoopConfiguration().set("fs.s3.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    sc._jsc.hadoopConfiguration().set("fs.s3a.awsAccessKeyId", 'id')
    sc._jsc.hadoopConfiguration().set("fs.s3a.awsSecretAccessKey", 'sid')
    sqlContext = SQLContext(sc)
    parquetDF = sqlContext.read.parquet("s3a://myBucketName/poc/folderName")

我已经使用命令 pyspark --packages org.apache.hadoop:hadoop-aws:3.3.0 下载了 hadoop-aws 包,但是当我在上面运行代码时收到以下错误。

An error occurred while calling o825.parquet.
: java.lang.RuntimeException: java.lang.ClassNotFoundException: Class org.apache.hadoop.fs.s3a.S3AFileSystem not found
    at org.apache.hadoop.conf.Configuration.getClass(Configuration.java:2195)
    at org.apache.hadoop.fs.FileSystem.getFileSystemClass(FileSystem.java:2654)
    at org.apache.hadoop.fs.FileSystem.createFileSystem(FileSystem.java:2667)

我在这里做错了什么? 我在 Windows 10 上使用 Anaconda 和 spyder 运行 python 代码

【问题讨论】:

【参考方案1】:

需要将开源 Hadoop S3 驱动程序的 Maven 坐标添加为包依赖项:

spark-submit --packages org.apache.hadoop:hadoop-aws:2.7.0

请注意,上述软件包版本与已安装的 AWS SDK for Java 版本相关联。

在 Spark 应用程序的代码中,可能还需要以下内容:

hadoop_conf = spark.sparkContext._jsc.hadoopConfiguration()
hadoop_conf.set("fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
hadoop_conf.set("fs.s3a.access.key", access_id)
hadoop_conf.set("fs.s3a.secret.key", access_key)

请注意,在使用开源 Hadoop 驱动程序时,S3 URI 方案是 s3a 而不是 s3(就像在 EMR 上使用 Spark 和 Amazon 的专有 EMRFS 时一样)。例如s3a://bucket-name/

感谢danielchalef

【讨论】:

以上是关于使用 pyspark 从 s3 位置读取镶木地板文件的文件夹到 pyspark 数据帧的主要内容,如果未能解决你的问题,请参考以下文章

使用 pyspark 将镶木地板文件(在 aws s3 中)存储到 spark 数据框中

使用 Pyspark 在 s3 中写入镶木地板文件时出错

在 s3 pyspark 作业中创建单个镶木地板文件

如何在读取前根据定义的模式读取 pyspark 中的镶木地板文件?

Pyspark:无法从 SparkFiles 读取镶木地板文件

从目录读取镶木地板文件时,pyspark不保存