咨询:Athena JsonSerDe字段名称映射配置为何未生效?
问题根源:映射方向搞反+表列名与预期不匹配
你遇到的字段映射被忽略的问题,核心是搞反了OpenX JsonSerDe映射参数的逻辑,同时表定义的列名和你预期的目标列名不一致。
先理清OpenX JsonSerDe的映射规则
这个SerDe的mapping参数语法是:'mapping.<table_column_name>' = '<json_field_name>',意思是:
把JSON原始数据里名为
<json_field_name>的字段,映射到Athena表中你定义的<table_column_name>列。
你的当前语句里,表定义的列是L_ListingID,却设置了'mapping.systemID' = 'L_ListingID'——这相当于告诉SerDe「把JSON里的L_ListingID字段,映射到表中名为systemID的列」,但你的表根本没定义systemID这个列,反而定义了L_ListingID,所以SerDe会直接跳过无效的映射配置,把JSON里的L_ListingID字段直接对应到表的L_ListingID列,完全达不到你想要的「生成systemID列」的效果。
正确的建表语句
如果你预期表中出现systemID列,用来对应JSON数据里的L_ListingID字段,调整后的语句应该是这样:
CREATE EXTERNAL TABLE ctc.rets ( `systemID` string ) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'mapping.systemID' = 'L_ListingID' ) LOCATION 's3://dmh.bucket/retsdata/' TBLPROPERTIES ('has_encrypted_data'='false');
额外注意点
- OpenX JsonSerDe默认大小写敏感,如果你的JSON字段是混合大小写(比如
listingId),映射参数里的字段名必须严格匹配; - 如果你的JSON原始字段是
systemID,想让表列显示为L_ListingID,那映射参数要写成'mapping.L_ListingID' = 'systemID',同时表定义的列保持L_ListingID即可。
内容的提问来源于stack exchange,提问作者Alex R
相关产品推荐
相关产品推荐

