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

Vin*_*aes 3 apache-spark parquet pyspark aws-glue

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

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

df = spark.read.parquet("s3://bucket/target/*.parquet")
df.show()
Run Code Online (Sandbox Code Playgroud)

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

"s3://bucket/target/2020/01/01/some-file.parquet"
"s3://bucket/target/2020/01/02/some-file.parquet"
Run Code Online (Sandbox Code Playgroud)

上面的代码会引发异常:

pyspark.sql.utils.AnalysisException: 'Path does not exist: s3://mailswitch-extract-underwr-prod/target/*.parquet;'
Run Code Online (Sandbox Code Playgroud)

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

为了运行我的代码,我将 AWS Glue 2.0 与 Spark 2.4 和 python 3 结合使用。

Vin*_*aes 5

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

"s3://bucket/target/2020/01/01/some-file.parquet"
"s3://bucket/target/2020/01/02/some-file.parquet"
Run Code Online (Sandbox Code Playgroud)

你可以做

df = spark.read.parquet("bucket/target/*/*/*/*.parquet")
Run Code Online (Sandbox Code Playgroud)

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