Hive含复杂Map列表按ID聚合选取非空值的替代方案
解决Hive中复杂Map列的维度聚合问题
针对你遇到的场景——按ID聚合时,每组内每行仅一个复杂MAP<STRING, STRUCT<...>>列非空、其余为NULL,且常规MAX()因Map不可排序失效的问题,给你两个高效简洁的替代方案:
方案1:使用collect_list+element_at提取非空值
利用分组后非空Map仅存一个的特点,先收集非空值到列表,再取列表首个元素即可:
SELECT id, element_at(collect_list(map_col1), 1) AS map_col1, element_at(collect_list(map_col2), 1) AS map_col2, -- 依次添加其他需要聚合的复杂Map字段 FROM your_table GROUP BY id
collect_list会自动忽略NULL值,每个分组的列表里只会保留唯一的非空Map,element_at直接提取即可,一次表扫描完成所有字段聚合。
方案2:用first_value窗口函数优先取非空值
通过窗口函数将非空值排在分组内的首位,再取第一个值后去重:
SELECT DISTINCT id, first_value(map_col1) OVER ( PARTITION BY id ORDER BY CASE WHEN map_col1 IS NOT NULL THEN 0 ELSE 1 END ) AS map_col1, first_value(map_col2) OVER ( PARTITION BY id ORDER BY CASE WHEN map_col2 IS NOT NULL THEN 0 ELSE 1 END ) AS map_col2, -- 依次添加其他需要聚合的复杂Map字段 FROM your_table
排序逻辑会把非空Map所在行排在分组最前面,first_value直接获取该值,最后用DISTINCT得到每个ID的唯一聚合结果,同样无需多次关联查询。
内容的提问来源于stack exchange,提问作者Enes Keles
相关产品推荐
相关产品推荐

