使用AWS Glue Crawler创建列名时如何移除或重命名特殊字符
AWS Glue Crawler 特殊字符列名处理方案
共有3种可在爬取过程/爬取完成后自动处理非法列名的方案,按实现复杂度从低到高排列如下:
1. 开启内置列名规范化功能(首选方案)
Glue Crawler官方提供了自动适配雅典娜命名规范的配置,开启后会自动将列名中的反斜杠、冒号、斜杠等特殊字符替换为下划线,同时自动转换为小写,完全符合Athena的列名要求:
- 操作路径:编辑现有Crawler → 进入「配置输出选项」页面 → 勾选*规范化列名(Normalize column names)*选项后保存即可
- 效果示例:原列名
RelatedAWSResources:0/name会自动转换为合法列名relatedawsresources_0_name
2. 自定义分类器指定列名
如果你的数据源是JSON、CSV等固定结构的格式,可以提前创建自定义分类器,直接指定符合规范的列名,Crawler识别时会优先使用你定义的列名,不会从源数据中提取带特殊字符的字段名:
- 针对JSON数据源:创建JSON分类器时,通过JSON路径映射的方式,将带特殊字符的源字段绑定到自定义的合法列名
- 针对CSV数据源:创建CSV分类器时,直接在「列名」配置项中填写你需要的合法列名列表即可
3. Lambda后置处理自定义重命名/排除列
如果需要自定义列名转换规则、或者要批量删除不符合要求的列,可以给Crawler配置运行完成触发器,Crawler爬取完成后自动触发Lambda函数调用Glue API修改表结构,以下是核心代码示例:
import boto3 import re glue = boto3.client('glue') # 非法字符匹配规则 invalid_char_pattern = re.compile(r'[^a-zA-Z0-9_]') def lambda_handler(event, context): database_name = event['databaseName'] table_name = event['tableName'] # 获取原表结构 table = glue.get_table(DatabaseName=database_name, Name=table_name) original_columns = table['Table']['StorageDescriptor']['Columns'] processed_columns = [] for col in original_columns: # 替换特殊字符为下划线 new_name = invalid_char_pattern.sub('_', col['Name']).lower() # 如需排除特定列,加判断跳过即可,示例:if 'xxx' in col['Name']: continue processed_columns.append({ 'Name': new_name, 'Type': col['Type'] }) # 更新表结构 table['Table']['StorageDescriptor']['Columns'] = processed_columns # 移除get_table返回的只读字段 del table['Table']['CreateTime'] del table['Table']['UpdateTime'] del table['Table']['CreatedBy'] del table['Table']['IsRegisteredWithLakeFormation'] glue.update_table(DatabaseName=database_name, TableInput=table['Table'])
内容的提问来源于stack exchange,提问作者Bokambo
相关产品推荐
相关产品推荐

