如何从路径部分不可预测的 s3 存储桶中读取 pyspark 中的镶木地板文件?

How to read parquet files in pyspark from s3 bucket whose path is partially unpredictable?

我的路径格式为 s3://my_bucket/timestamp=yyyy-mm-dd HH:MM:SS/

例如s3://my-bucket/timestamp=2021-12-12 12:19:27/,但是 MM:SS 部分是不可预测的,我有兴趣阅读给定小时的数据。我尝试了以下方法:

  1. df = spark.read.parquet("s3://my-bucket/timestamp=2021-12-12 12:*:*/")
  2. df = spark.read.parquet("s3://my-bucket/timestamp=2021-12-12 12:[00,01-59]:[00,01-59]/")

但他们给出错误 pyspark.sql.utils.IllegalArgumentException: java.net.URISyntaxException

问题是您的路径包含冒号 :。不幸的是,它仍然不受支持。以下是一些相关的工单:

和线程:

我认为唯一的方法是重命名这些文件...

如果你想要性能......

我谦虚地建议,当您重新构建它时,您不要使用 S3 文件 lists/directory 列表来完成它。我建议您使用按小时分区的 Hive table。 (或者你写了一个工作来帮助将数据迁移到大文件而不是小文件中的几个小时。)

S3 是一款出色的长期廉价存储引擎。它的性能不佳,而且由于它们的实现方式,它在目录列表方面尤其糟糕。 (如果目录中有多个小文件,性能只会变得更差)。

要从您的工作中获得一些真正的性能,您应该使用配置单元 table(已分区以便文件查找在 DynamoDB 中完成,并且分区在小时级别。)或其他一些经过整理的文件结构这减少了文件 count/directories 所需的清单。

如果您可以在不使用文件列表的情况下将数据重组为更大的文件,您将看到性能的大幅提升。