ARRAY_DISTINCT 数组去重
ARRAY_DISTINCT 去掉数组中的重复元素。除 Hive 外都同名可用,差异在元素顺序和 NULL:MaxCompute、Doris 和 Flink 保持原顺序,StarRocks 文档说明返回顺序可能变化;多数引擎会保留一个 NULL。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | ARRAY_DISTINCT(a) | 保持原有顺序;NULL 参与去重,结果中保留一个 NULL;空数组返回空数组。 | 官方文档 |
| Hologres | 支持 | ARRAY_DISTINCT(array) | Hologres V1.3.19 起支持,暂不支持对常量数组调用。 | 官方文档 |
| StarRocks | 支持 | array_distinct(array) | 返回数组中元素的顺序可能与原数组不同。 | 官方文档 |
| Doris | 支持 | ARRAY_DISTINCT(arr) | 2.0.0 起提供,保持原有顺序,只保留每个元素第一次出现的位置。数组为 NULL 时返回 NULL。 | 官方文档已实测 4.1.5 |
| Hive | 需改写 | collect_set(x) | 内置函数文档中没有 array_distinct。对已经展开的列可以用 collect_set 重新聚合去重,顺序不保证。 | 官方文档已实测 4.2.1 |
| Spark SQL | 支持 | array_distinct(array) | Spark 2.4.0 起提供,文档示例中保留一个 NULL:[1,2,3,null]。 | 官方文档 |
| Flink SQL | 支持 | ARRAY_DISTINCT(haystack) | 保持元素顺序,数组为 NULL 时返回 NULL。 | 官方文档已实测 2.3.0 |
迁移注意事项
- StarRocks 文档说明去重后的顺序可能变化。依赖元素顺序(例如取第一个元素)的逻辑,迁移到 StarRocks 时要先排序或改写。
- NULL 不会被去掉,多个 NULL 只保留一个。需要去掉 NULL 时,要再用 ARRAY_FILTER 等函数过滤。
- Hive 内置函数文档中没有 array_distinct,旧 SQL 常用 explode 加 collect_set 去重,迁移到其他引擎时可以直接改成 ARRAY_DISTINCT。
示例
去掉标签数组中的重复项
SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;SELECT user_id, array_distinct(tags) AS tags FROM user_tags;SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;SELECT user_id, array_distinct(tags) AS tags FROM user_tags;SELECT user_id, ARRAY_DISTINCT(tags) AS tags FROM user_tags;