使用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
相关产品推荐
相关产品推荐

