Athena中如何将UNNEST后的JSON数组转为列值?
在Athena中将JSON数组转换为单行键值列
要实现把headers数组转换为单行、以key为列名、value为对应值的结果,你可以通过聚合键值对为Map,再提取Map中的键作为列的方式实现,以下是具体方案:
解决方案代码
WITH parsed_headers AS ( SELECT -- 将展开后的键值对聚合为一个Map MAP_AGG( JSON_EXTRACT_SCALAR(e, '$.key'), JSON_EXTRACT_SCALAR(e, '$.value') ) AS headers_map FROM headers CROSS JOIN UNNEST(CAST(JSON_PARSE(headers) AS ARRAY(JSON))) AS t(e) ) SELECT headers_map['Name'] AS "Name", headers_map['Email'] AS "Email", headers_map['ID'] AS "ID", headers_map['Company'] AS "Company", headers_map['Groups'] AS "Groups", headers_map['Address'] AS "Address", headers_map['State'] AS "State", headers_map['Component'] AS "Component", headers_map['LastUsed'] AS "LastUsed" FROM parsed_headers;
代码说明
- 展开数组:用
UNNEST配合JSON_PARSE把headers字段的JSON数组拆分为单个JSON对象行; - 聚合为Map:通过
MAP_AGG函数,将每个对象的key作为Map的键、value作为Map的值,聚合为一个单行的Map对象; - 提取列:直接通过
headers_map['键名']的方式,把Map中的每个键转换为独立列,对应的值就是原数组中value的内容。
原代码问题分析
你之前的代码仅将每个数组元素转换为Map,但没有做聚合操作,结果还是多行的单个Map,而通过MAP_AGG可以把所有键值对合并为一个单行Map,进而提取出所需的列。
内容的提问来源于stack exchange,提问作者NMAK
相关产品推荐
相关产品推荐

