如何在AWS Glue中按文件名部分关键字读取S3存储桶文件
AWS Glue 按文件名关键字读取并合并S3文件
方法一:利用Glue内置文件过滤参数(推荐)
Glue的create_dynamic_frame.from_options支持通过include参数用正则表达式匹配文件名,直接筛选符合条件的文件并自动合并,无需额外代码。
修改后的代码示例:
# 读取所有文件名包含"file"的CSV文件并自动合并 File_node = glueContext.create_dynamic_frame.from_options( format_options={"quoteChar": '"', "withHeader": True, "separator": ","}, connection_type="s3", format="csv", connection_options={ "paths": ["s3://env-files/data/material/"], # 指定目标目录,不要写具体文件名 "recurse": True, # 如需遍历子目录则设为True,否则False "include": ".*file.*\\.csv$" # 正则规则:匹配包含"file"且以.csv结尾的文件 }, transformation_ctx="File_node", ) File_df = File_node.toDF()
参数说明:
paths:指定到目录层级,而非单个文件include:正则表达式,.*file.*匹配任意位置包含"file"的字符串,\\.csv$确保匹配CSV后缀recurse:控制是否遍历子目录,按需设置
方法二:通过boto3手动筛选文件(适用于复杂逻辑)
如果需要更灵活的筛选条件(比如结合文件修改时间、大小等),可以先用boto3列出S3桶内文件,再筛选符合条件的路径传给Glue。
代码示例:
import boto3 # 初始化S3客户端 s3 = boto3.client('s3') bucket_name = 'env-files' prefix = 'data/material/' file_paths = [] # 列出指定前缀下的所有文件(处理分页) response = s3.list_objects_v2(Bucket=bucket_name, Prefix=prefix) while True: for obj in response.get('Contents', []): file_name = obj['Key'].split('/')[-1] # 筛选文件名包含"file"的文件 if 'file' in file_name: file_paths.append(f's3://{bucket_name}/{obj["Key"]}') # 检查是否还有下一页数据 if not response.get('IsTruncated'): break response = s3.list_objects_v2( Bucket=bucket_name, Prefix=prefix, ContinuationToken=response['NextContinuationToken'] ) # 读取筛选后的文件 if file_paths: File_node = glueContext.create_dynamic_frame.from_options( format_options={"quoteChar": '"', "withHeader": True, "separator": ","}, connection_type="s3", format="csv", connection_options={ "paths": file_paths, "recurse": False # 已指定具体文件路径,无需递归 }, transformation_ctx="File_node", ) File_df = File_node.toDF() else: print("未找到符合条件的文件")
适用场景:需要除文件名关键字外的额外筛选条件时使用,比如只读取7天内修改的文件。
内容的提问来源于stack exchange,提问作者RISHI SAXENA
相关产品推荐
相关产品推荐

