SQL 方言通

首页 / 数组和 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 返回键值对个数。官方文档

迁移注意事项

示例

统计每个用户的标签个数

MaxCompute
SELECT user_id, SIZE(tags) AS tag_cnt FROM user_tags;
Hologres
SELECT user_id, ARRAY_LENGTH(tags, 1) AS tag_cnt FROM user_tags;
StarRocks
SELECT user_id, array_length(tags) AS tag_cnt FROM user_tags;
Doris
SELECT user_id, ARRAY_SIZE(tags) AS tag_cnt FROM user_tags;
Hive
SELECT user_id, size(tags) AS tag_cnt FROM user_tags;
Spark SQL
SELECT user_id, size(tags) AS tag_cnt FROM user_tags;
Flink SQL
SELECT user_id, CARDINALITY(tags) AS tag_cnt FROM user_tags;

同类函数

最后核对日期: