【问题标题】:Read CSV file from AWS S3从 AWS S3 读取 CSV 文件
【发布时间】:2019-03-18 03:56:39
【问题描述】:

我有一个运行 pyspark 的 EC2 实例,我能够连接到它 (ssh) 并在 Jupyter Notebook 中运行交互式代码。

我有一个 S3 存储桶,其中包含我想要读取的 csv 文件,当我尝试使用以下方式读取它时:

spark = SparkSession.builder.appName('Basics').getOrCreate()
df = spark.read.csv('https://s3.us-east-2.amazonaws.com/bucketname/filename.csv')

这会引发一条长长的 Python 错误消息,然后是与以下内容相关的内容:

Py4JJavaError:调用 o131.csv 时出错。

【问题讨论】:

    标签: apache-spark pyspark


    【解决方案1】:

    指定 S3 路径以及访问密钥和密钥,如下所示:

    's3n://<AWS_ACCESS_KEY_ID>:<AWS_SECRET_ACCESS_KEY>@my.bucket/folder/input_data.csv'
    

    【讨论】:

    • 更改它并不能解决问题。得到同样的错误,如果我将文件移动到 EC2 目录,我可以在不传递用户和密码信息的情况下读取它
    【解决方案2】:

    访问密钥相关信息可以通过典型的 URL 用户名+密码方式引入。通常,访问协议应该是s3a,是s3n 的继承者(参见Technically what is the difference between s3n, s3a and s3?)。把这些放在一起,你得到

    spark.read.csv("s3a://<AWS_ACCESS_KEY_ID>:<AWS_SECRET_ACCESS_KEY>@bucketname/filename.csv")
    

    顺便说一句,一些 Spark 执行环境(例如 Databricks)允许将 S3 存储桶作为文件系统的一部分进行挂载。当您使用 s3fs 之类的东西构建集群时,您也可以这样做。

    【讨论】:

    • 更改它并不能解决问题。得到同样的错误,如果我将文件移动到 EC2 目录,我可以在不传递用户和密码信息的情况下读取它
    • 当然,EC2 卷通常具有普通文件系统,因此您可以直接从中读取。如果没有更多信息(例如角色、权限、完整代码、完整堆栈跟踪等),很难诊断您的问题。上面的答案是 Spark 如何在不挂载的情况下访问 S3。如果它不适合你,那就是配置/权限问题。
    猜你喜欢
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 2015-08-30
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2021-10-18
    相关资源
    最近更新 更多