在AWS Athena中如何查询struct<$oid:string>类型的字段?
问题原因
Athena底层依赖的Hive DDL语法不支持结构体内部的字段名以$开头,你遇到的报错就是因为自动生成的struct结构里包含$oid字段,不符合语法规范导致的。
可行解决方案
方案1:修改Glue表定义(推荐,长期使用最优)
- 无需修改S3上的原始JSON文件,直接在Glue数据目录中调整对应表的字段配置即可
- 进入AWS Glue控制台,找到「数据目录」-「表」,定位到你要查询的表
- 点击编辑表结构,找到
id/_id字段,把原有的struct<$oid:string>类型改为string,保存修改 - 直接在Athena中查询,返回的id值就是原
$oid对应的字符串内容
- 如果是用Glue Crawler自动爬取生成的表,可以给Crawler新增自定义JSON分类器,配置匹配规则直接把
_id.$oid映射为string类型的id字段,后续爬取就不会再生成带$的非法struct结构
方案2:临时查询无需改表,直接用JSON函数解析
如果只是临时查询不想修改表结构,可以直接通过Athena的JSON解析函数提取值:
-- 路径根据你实际的JSON结构调整即可,如果_id是顶层字段则路径为'$._id.$oid' SELECT json_extract_scalar(raw_json_line, '$._id.$oid') AS id, other_fields FROM your_table_name
该方案查询性能低于提前配置好表结构的方案,仅适合临时查询场景。
内容的提问来源于stack exchange,提问作者Jay Ramsay
相关产品推荐
相关产品推荐

