首页 / 数组和 Map
SIZE 数组和 Map 元素个数
SIZE 返回数组的元素个数或 Map 的键值对个数。MaxCompute、Hive 和 Spark 同名可用;StarRocks 和 Doris 要按数组、Map 分别用不同函数;Flink 用 CARDINALITY;Hologres 用 ARRAY_LENGTH 并指定维度。
各引擎写法
| 引擎 | 支持 | 写法 | 说明 | 依据 |
|---|---|---|---|---|
| MaxCompute | 支持 | SIZE(array_or_map) | 同一个函数可以处理 ARRAY 和 MAP,返回 INT。 | 官方文档 |
| Hologres | 需改写 | ARRAY_LENGTH(arr, 1) | 第二个参数是维度,从 1 开始,一维数组传 1。数组函数文档只覆盖 ARRAY。 | 官方文档 |
| StarRocks | 别名 | array_length(arr) / map_size(m) | 数组用 array_length,别名 cardinality,3.0 起提供,NULL 元素也计入长度,输入为 NULL 时返回 NULL。Map 用 map_size,2.5 起提供,别名同样是 cardinality。 | 官方文档 |
| Doris | 别名 | ARRAY_SIZE(arr) / MAP_SIZE(m) | 数组用 ARRAY_SIZE,NULL 元素也计入,输入为 NULL 时返回 NULL。Map 用 MAP_SIZE,NULL 键和值都计入。 | 官方文档 |
| Hive | 支持 | size(array_or_map) | 同一个函数可以处理 ARRAY 和 MAP,返回 INT。 | 官方文档 |
| Spark SQL | 支持 | size(expr) | Spark 1.5.0 起提供,同时有别名 cardinality。输入为 NULL 时,只有关闭 ANSI 模式并开启 spark.sql.legacy.sizeOfNull 才返回 -1,否则返回 NULL。最新文档写明默认配置下返回 NULL。 | 官方文档 |
| Flink SQL | 别名 | CARDINALITY(array_or_map) | 数组返回元素个数,Map 返回键值对个数。 | 官方文档 |
迁移注意事项
- Spark 对 NULL 输入可能返回 -1,也可能返回 NULL,取决于 ANSI 模式和 spark.sql.legacy.sizeOfNull 两个配置。Spark 3.x 默认关闭 ANSI 模式,所用版本的默认值要按对应版本文档确认。下游有 size(x) = -1 这类判断时,迁移前要先核对配置。
- StarRocks 和 Doris 区分数组和 Map 函数。从 MaxCompute 或 Hive 迁移时,要按字段类型分别改成 array_length、map_size 或 ARRAY_SIZE、MAP_SIZE。
- Hologres 文档中 ARRAY_LENGTH 的签名带维度参数,一维数组也要写成 ARRAY_LENGTH(arr, 1)。
- StarRocks 和 Doris 文档写明 NULL 元素也计入个数。需要只统计非空元素时,要先过滤再计数。
示例
统计每个用户的标签个数
SELECT user_id, SIZE(tags) AS tag_cnt FROM user_tags;SELECT user_id, ARRAY_LENGTH(tags, 1) AS tag_cnt FROM user_tags;SELECT user_id, array_length(tags) AS tag_cnt FROM user_tags;SELECT user_id, ARRAY_SIZE(tags) AS tag_cnt FROM user_tags;SELECT user_id, size(tags) AS tag_cnt FROM user_tags;SELECT user_id, size(tags) AS tag_cnt FROM user_tags;SELECT user_id, CARDINALITY(tags) AS tag_cnt FROM user_tags;