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

如何让AWS Glue爬虫不基于S3子文件夹创建分区?

解决AWS Glue自动创建分区列的问题

问题背景

我的S3数据存储结构如下:

s3://project/vehicle1/tbl_vehicle1_speeddata/trip00000001/00000001.parquet
s3://project/vehicle1/tbl_vehicle1_speeddata/trip00000001/00000002.parquet
...
s3://project/vehicle1/tbl_vehicle1_speeddata/trip00000002/00000001.parquet

我使用AWS Glue为Athena查询准备数据,希望按消息级别创建独立表(如tbl_vehicle1_speeddata),同时保留原始硬件的trip分组S3文件夹结构,方便MATLAB、Python等工具处理。但Glue会自动生成partition_0列对应trip子文件夹,导致新增trip时必须重新运行爬虫,尽管所有Parquet文件的schema一致。我需要保留现有S3结构,强制Glue不自动基于路径创建分区,优先采用控制台设置方案,其次考虑boto3 API,且无法手动编辑动态生成的不同schema的表。


一、AWS控制台设置方案

1. 手动创建Glue表(推荐)

  • 进入AWS Glue控制台,在「表」页面点击「添加表」,选择目标数据库后进入「定义表属性」步骤。
  • 在「数据存储位置」中填写表的根路径:s3://project/vehicle1/tbl_vehicle1_speeddata/。
  • 关键操作:在「分区键」环节不要添加任何分区键,直接跳过该步骤。
  • 选择「从S3中的数据推断schema」,Glue会扫描路径下所有Parquet文件生成schema,不会将trip文件夹识别为分区。
  • 表创建完成后,新增trip文件夹及文件无需重新运行爬虫,Athena可直接查询新数据。

2. 修改现有爬虫配置

  • 进入Glue控制台的「爬虫」页面,找到目标爬虫并点击「编辑」。
  • 在「配置爬虫的输出」步骤中,设置「分组行为」为「创建单个表」,并关闭「启用分区检测」选项。
  • 保存配置后重新运行爬虫,爬虫会将所有路径下的数据作为单表数据,不再生成partition_0列。

二、boto3 API方案

1. 手动创建无分区表

import boto3

glue = boto3.client('glue')

response = glue.create_table(
    DatabaseName='你的数据库名',
    TableInput={
        'Name': 'tbl_vehicle1_speeddata',
        'StorageDescriptor': {
            'Location': 's3://project/vehicle1/tbl_vehicle1_speeddata/',
            'InputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat',
            'OutputFormat': 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat',
            'SerdeInfo': {
                'SerializationLibrary': 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
            },
            # 替换为你的实际列名和数据类型
            'Columns': [
                {'Name': 'speed', 'Type': 'double'},
                {'Name': 'timestamp', 'Type': 'timestamp'},
            ]
        },
        # 核心:不设置PartitionKeys字段
        'TableType': 'EXTERNAL_TABLE'
    }
)

2. 修改爬虫配置禁用分区检测

import boto3

glue = boto3.client('glue')

response = glue.update_crawler(
    Name='你的爬虫名称',
    Targets={
        'S3Targets': [
            {
                'Path': 's3://project/vehicle1/tbl_vehicle1_speeddata/',
                'Exclusions': []
            }
        ]
    },
    SchemaChangePolicy={
        'UpdateBehavior': 'UPDATE_IN_DATABASE',
        'DeleteBehavior': 'DELETE_FROM_DATABASE'
    },
    # 禁用分区检测的关键配置
    Configuration='{"Version":1.0,"CrawlerOutput":{"Partitions":{"AddOrUpdateBehavior":"InheritFromTable"}},"Grouping":{"TableGroupingPolicy":"CombineCompatibleSchemas"}}'
)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 16:42:48