使用 pyspark/python 列出 AWS S3 目录中的文件

Posted

技术标签:

【中文标题】使用 pyspark/python 列出 AWS S3 目录中的文件【英文标题】:List files in directory on AWS S3 with pyspark/python 【发布时间】:2017-03-29 14:26:24 【问题描述】:

所以,我是 AWS S3 和 pyspark 和 linux 的新手。我不知道从哪里开始。这是我的问题:

在 linux 中,我可以发出以下命令,并且可以看到文件夹中的文件:

aws s3 ls 's3://datastore/L2/parquet'

用 python 做类似的事情是行不通的

import os
os.listdir('s3://datastore/L2/parquet')

报错:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
OSError: [Errno 2] No such file or directory: 's3://datastore/L2/parquet'

不过,pysparkSQLContext.read.parquet 很好理解:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)
df = sqlContext.read.parquet('s3://datastore/L2/parquet')

为什么它在SQLContext 中有效而在os.listdir 中无效?我可以从哪里开始消除我的困惑?除了“获得 CS 学士学位”之外的任何回复都会有所帮助。

【问题讨论】:

【参考方案1】:

因此,AWS s3 与您操作系统的文件系统不同。 AWS s3 ls 命令和 pyspark SQLContext.read 命令执行的操作与 os.listdir 命令不同,后者不知道如何从 s3 读取内容。

要从 s3 读取内容,我建议查看 boto3 库或 s3fs 库,它是 boto3 的包装器,将 s3 视为文件系统。 boto3 中有多种选项可用于列出存储桶和存储桶中的文件。

来自the s3 docs:

在实现方面,存储桶和对象都是资源,Amazon S3 提供 API 供您管理。

如果你不知道 Linux 文件系统是如何工作的,我建议你阅读一下,也许像 this 这样的东西会有所帮助。

【讨论】:

以上是关于使用 pyspark/python 列出 AWS S3 目录中的文件的主要内容,如果未能解决你的问题,请参考以下文章

AWS S3 对象列表

如何在 AWS-Glue 脚本中编写用户定义的函数?

AWS Batch:未列出 aws batch 的角色

如何使用 Java 列出存储桶中的所有 AWS S3 对象

列出 aws 存储桶中的对象

我正在尝试使用 python boto3 列出 aws ECS 集群中的所有集群,它最多只能列出 100 个集群,我想要 300 个集群