从 PySpark 中的 s3 子目录读取数据

Reading data from s3 subdirectories in PySpark

我想从 S3 存储桶中读取所有 parquet 文件,包括子目录中的所有文件(这些实际上是前缀)。

在 S3 url 中使用通配符 (*) 仅适用于指定文件夹中的文件。例如,使用此代码只会读取 target/ 文件夹下的镶木地板文件。

df = spark.read.parquet("s3://bucket/target/*.parquet")
df.show()

假设我的 s3 存储桶中有这样的结构:

"s3://bucket/target/2020/01/01/some-file.parquet"
"s3://bucket/target/2020/01/02/some-file.parquet"

以上代码会引发异常:

pyspark.sql.utils.AnalysisException: 'Path does not exist: s3://mailswitch-extract-underwr-prod/target/*.parquet;'

如何从我的 s3 存储桶的子目录中读取所有 parquet 文件?

对于 运行 我的代码,我将 AWS Glue 2.0 与 Spark 2.4 和 python 3.

一起使用

这对我有用:

df = spark.read.parquet("s3://your/path/here/some*wildcard")

如果要读取目标文件夹下的所有parquet文件

"s3://bucket/target/2020/01/01/some-file.parquet"
"s3://bucket/target/2020/01/02/some-file.parquet"

你可以做到

df = spark.read.parquet("bucket/target/*/*/*/*.parquet")

缺点是您需要知道镶木地板文件的深度。