如何使用PySpark在AWS Glue中读取S3指定日期目录的CSV子集
解决AWS Glue读取S3指定日期目录CSV文件的问题
你的问题出在Glue对S3路径通配符的解析逻辑上,直接在paths中使用2022_*无法正确匹配子目录,下面提供几种可行的解决方案:
方案1:调整路径通配符与参数
Glue支持在paths中使用通配符,但需确保通配符指向正确的层级,同时可调整recurse参数:
data = glueContext.create_dynamic_frame_from_options( connection_type="s3", connection_options={ "paths": ["s3://bucket/shopify/orders/2022_*"], "recurse": True # 开启递归读取该通配符匹配目录下的所有文件 }, format="csv", format_options={ "separator": ",", "withHeader": True } ).toDF()
如果通配符匹配后仍无法读取,可尝试去掉recurse参数,部分场景下通配符已指定到子目录层级,无需额外递归。
方案2:使用include过滤规则
通过指定根路径,再用include参数匹配目标目录下的所有文件,这种方式更灵活,适用于复杂的目录匹配:
data = glueContext.create_dynamic_frame_from_options( connection_type="s3", connection_options={ "paths": ["s3://bucket/shopify/orders/"], "include": "2022_*/*", # 匹配所有2022_开头的子目录下的文件 "recurse": True }, format="csv", format_options={ "separator": ",", "withHeader": True } ).toDF()
include支持glob模式,2022_*/*会精准匹配所有以2022_开头的子目录下的CSV文件。
方案3:手动生成目标路径列表
如果上述方法都不生效,可通过boto3主动列出符合条件的S3目录,再传入paths参数:
import boto3 # 初始化S3客户端 s3_client = boto3.client('s3') bucket = "bucket" target_prefix = "shopify/orders/2022_" # 列出所有2022_开头的子目录 response = s3_client.list_objects_v2(Bucket=bucket, Prefix=target_prefix, Delimiter='/') target_paths = [f"s3://{bucket}/{cp['Prefix']}" for cp in response.get('CommonPrefixes', [])] # 读取目标目录下的数据 data = glueContext.create_dynamic_frame_from_options( connection_type="s3", connection_options={ "paths": target_paths, "recurse": True }, format="csv", format_options={ "separator": ",", "withHeader": True } ).toDF()
注意:如果目录数量较多,需处理list_objects_v2的分页逻辑(通过ContinuationToken循环获取所有结果)。
内容的提问来源于stack exchange,提问作者ben890
相关产品推荐
相关产品推荐

