如何让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
相关产品推荐
相关产品推荐

