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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 21:25:29