MAP_UNION

功能概述

聚合函数,把多行 MAP 合并成一个 MAP,结果包含所有行中出现过的 key。适合把分散在多行的属性、配置、标签汇总为一个 MAP,例如合并同一用户多次上报的设备属性。

和 MAP_UNION_SUM 的区别:

MAP_UNION_SUM
MAP_UNION_SUM
对相同 key 的 value 求和;
MAP_UNION
MAP_UNION
不做计算,相同 key 只保留其中一个 value。需要把两列 key、value 聚合成 MAP 时用 MAP_AGG。

语法

MAP_UNION(<map_expr>) [FILTER (WHERE <condition>)]

参数说明

  • <map_expr>
    <map_expr>
    :MAP 类型的列或表达式,value 可以是任意类型(包括 ARRAY 等复杂类型)。值为 NULL 的行被跳过。

  • FILTER (WHERE <condition>)
    FILTER (WHERE <condition>)
    :可选,只聚合满足条件的行。

返回类型与输入的 MAP 类型相同。

使用示例

合并多行 MAP,NULL 行被跳过:

SELECT map_union(a) AS merged FROM VALUES (map(1L, 'a')), (null), (map(2L, 'b')) AS t(a);

merged
{1:"a",2:"b"}

value 为复杂类型:

SELECT map_union(a) AS merged FROM VALUES (map('x', array(1, 2))), (map('y', array(3))) AS t(a);

merged
{"x":[1,2],"y":[3]}

按分组合并,并用 FILTER 只聚合部分行。前置数据:

CREATE TABLE IF NOT EXISTS doc_map_union_attrs (user_id STRING, attrs MAP<STRING, STRING>, source STRING); INSERT INTO doc_map_union_attrs VALUES ('u1', map('os', 'iOS'), 'app'), ('u1', map('city', '上海'), 'web'), ('u1', map('lang', 'zh'), 'app'), ('u2', map('os', 'Android'), 'app');

SELECT user_id, map_union(attrs) AS all_attrs, map_union(attrs) FILTER (WHERE source = 'app') AS app_attrs FROM doc_map_union_attrs GROUP BY user_id ORDER BY user_id;

user_idall_attrsapp_attrs
u1{"os":"iOS","city":"上海","lang":"zh"}{"os":"iOS","lang":"zh"}
u2{"os":"Android"}{"os":"Android"}

注意事项

  • 相同 key 的 value 取值不确定。
  • 结果 MAP 中 key 的顺序不保证。
  • NULL 行被跳过,不影响其他行。

相关文档

联系我们
预约咨询
微信咨询
电话咨询
邮件咨询