请求将Presto SQL中的MAP_AGG子查询转换为Databricks SQL
Presto SQL转Databricks SQL:MAP_AGG替代方案
直接替代MAP_AGG的正确写法
在Databricks SQL中,没有直接对应的MAP_AGG函数,但可以通过collect_list聚合键和值的数组,再用map_from_arrays转换为Map类型,完美匹配原Presto逻辑:
PSF_PIVOT AS (SELECT A.PATIENT_ID, A.REPORT_ID, A.VISIT_DATE, A.DISEASE_GROUP, map_from_arrays(collect_list(A.NAME), collect_list(A.VALUE)) AS KV FROM PSF_BEST A GROUP BY A.PATIENT_ID, A.REPORT_ID, A.VISIT_DATE, A.DISEASE_GROUP )
为什么直接用MAP会报错?
你之前尝试用MAP替代MAP_AGG报错,核心原因是MAP是单行构造函数,只能基于单条记录的字段生成Map,无法对分组后的多条记录做聚合操作。必须先通过聚合函数(比如collect_list)收集分组内所有的NAME和VALUE,再用map_from_arrays将两个数组对应组合成Map。
补充:用PIVOT实现列转行(若需展开为列)
如果你的需求是把NAME作为列名、VALUE作为列值(而非生成Map),可以使用Databricks的PIVOT语法:
PSF_PIVOT AS (SELECT * FROM PSF_BEST PIVOT ( -- 根据VALUE的数据类型选择聚合函数,字符串用first,数值用sum等 first(VALUE) FOR NAME IN ('name1', 'name2', 'name3') -- 替换为你的实际NAME取值 ) GROUP BY PATIENT_ID, REPORT_ID, VISIT_DATE, DISEASE_GROUP )
注意:PIVOT需要明确指定要转置的NAME值,无法像MAP_AGG那样动态生成所有键值对。
内容的提问来源于stack exchange,提问作者Gaurav Sitaula
相关产品推荐
相关产品推荐

