You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PySpark读取S3数据时如何过滤指定日期的S3路径

S3指定日期前缀Parquet文件更优读取方案

你的现有方案可正常运行,不过无需额外调用boto3拉取路径列表,用Spark原生的路径通配符能力即可实现更简洁的实现:

方案1:固定日期场景直接写通配符路径

直接在parquet方法中传入带通配符的路径即可,*会匹配日期前缀后的任意字符,刚好覆盖单日两个带时间戳后缀的文件夹:

df = spark.read.parquet(
    "s3://bucketname/20211126*/*.parquet",
    "s3://bucketname/20211127*/*.parquet"
)

该方案不需要额外调用S3 API拉取对象列表,Spark底层会自动完成路径的扫描和过滤,性能和你现有方案一致,但代码量大幅简化。

方案2:动态日期场景批量生成路径

如果需要读取的日期范围经常调整,可以批量生成对应前缀的通配符路径,避免硬写多条路径:

from datetime import datetime, timedelta

# 按需调整起止日期
start_dt = datetime(2021, 11, 26)
end_dt = datetime(2021, 11, 27)
path_list = []
curr_dt = start_dt
while curr_dt <= end_dt:
    path_list.append(f"s3://bucketname/{curr_dt.strftime('%Y%m%d')}*/*.parquet")
    curr_dt += timedelta(days=1)

df = spark.read.parquet(*path_list)

可选优化建议

  • 提前指定Schema:读取时传入提前定义好的Parquet Schema,跳过Spark扫描全量文件推断Schema的步骤,大数量级下能显著提升读取速度,写法为spark.read.schema(自定义Schema对象).parquet(...)
  • 长期使用可调整为分区结构:如果后续频繁有按日期读取的需求,建议将目录调整为Hive风格分区格式,例如s3://bucketname/date=20211126/ts=20211126123455/*.parquet,后续读取可以直接用Spark分区裁剪功能,写法更规范,也能避免通配符匹配错误的问题。

内容的提问来源于stack exchange,提问作者greenking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 18:06:10