首页 / 数组和 Map
数组和 Map 函数对照
数组和 Map 函数在 MaxCompute、Hologres、StarRocks、Doris、Hive、Spark SQL、Flink SQL 中的写法对照,共 8 个函数。其中 7 个函数在部分引擎中需要改写或没有对应函数。
目录:array_contains · array_distinct · array_join · explode · posexplode · size · sort_array · str_to_map
ARRAY_CONTAINS 判断数组是否包含元素
ARRAY_CONTAINS 判断数组中是否有指定元素,七个引擎都同名可用。差异在返回类型和版本:StarRocks 返回 1 或 0 而不是布尔值,Hologres 需要 V1.3.19 及以上版本,并且不支持常量数组。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | ARRAY_CONTAINS(a, v) |
| Hologres | 支持 | ARRAY_CONTAINS(array, target_value) |
| StarRocks | 支持 | array_contains(any_array, any_element) |
| Doris | 支持 | ARRAY_CONTAINS(arr, value) |
| Hive | 支持 | array_contains(Array<T>, value) |
| Spark SQL | 支持 | array_contains(array, value) |
| Flink SQL | 支持 | ARRAY_CONTAINS(haystack, needle) |
ARRAY_DISTINCT 数组去重
ARRAY_DISTINCT 去掉数组中的重复元素。除 Hive 外都同名可用,差异在元素顺序和 NULL:MaxCompute、Doris 和 Flink 保持原顺序,StarRocks 文档说明返回顺序可能变化;多数引擎会保留一个 NULL。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | ARRAY_DISTINCT(a) |
| Hologres | 支持 | ARRAY_DISTINCT(array) |
| StarRocks | 支持 | array_distinct(array) |
| Doris | 支持 | ARRAY_DISTINCT(arr) |
| Hive | 需改写 | collect_set(x) |
| Spark SQL | 支持 | array_distinct(array) |
| Flink SQL | 支持 | ARRAY_DISTINCT(haystack) |
ARRAY_JOIN 数组拼接成字符串
ARRAY_JOIN 用分隔符把数组元素拼成字符串,可以用第三个参数替换 NULL 元素,不传时跳过 NULL。MaxCompute、StarRocks、Doris、Spark 和 Flink 同名可用;Hologres 用 ARRAY_TO_STRING;Hive 用 concat_ws,并且只接受字符串数组。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | ARRAY_JOIN(a, delimiter[, nullreplacement]) |
| Hologres | 需改写 | ARRAY_TO_STRING(anyarray, text[, text]) |
| StarRocks | 支持 | array_join(array, sep[, null_replace_str]) |
| Doris | 支持 | ARRAY_JOIN(arr, separator[, null_replacement]) |
| Hive | 需改写 | concat_ws(SEP, array<string>) |
| Spark SQL | 支持 | array_join(array, delimiter[, nullReplacement]) |
| Flink SQL | 支持 | ARRAY_JOIN(array, delimiter[, nullReplacement]) |
EXPLODE 数组展开为多行
EXPLODE 把数组的每个元素展开成一行,常用于处理多值字段。MaxCompute、Doris、Hive 和 Spark 用 EXPLODE,Hologres 和 StarRocks 用 UNNEST,Flink 用 CROSS JOIN UNNEST。空数组和 NULL 数组的处理是迁移时最容易漏掉的地方。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | EXPLODE(var) |
| Hologres | 需改写 | UNNEST(anyarray) |
| StarRocks | 需改写 | FROM t, UNNEST(arr) AS u(x) |
| Doris | 支持 | LATERAL VIEW EXPLODE(arr) t AS x |
| Hive | 支持 | explode(array | map) |
| Spark SQL | 支持 | explode(expr) |
| Flink SQL | 需改写 | CROSS JOIN UNNEST(arr) AS t(x) |
POSEXPLODE 带下标展开数组
POSEXPLODE 把数组展开成多行,同时输出元素在数组中的位置,位置从 0 开始。MaxCompute、Doris、Hive 和 Spark 支持;Hologres、StarRocks 和 Flink 的文档中没有带位置的展开函数,需要另行改写。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | POSEXPLODE(array) |
| Hologres | 不支持 | — |
| StarRocks | 不支持 | — |
| Doris | 支持 | POSEXPLODE(array) |
| Hive | 支持 | posexplode(ARRAY<T> a) |
| Spark SQL | 支持 | posexplode(expr) |
| Flink SQL | 不支持 | — |
SIZE 数组和 Map 元素个数
SIZE 返回数组的元素个数或 Map 的键值对个数。MaxCompute、Hive 和 Spark 同名可用;StarRocks 和 Doris 要按数组、Map 分别用不同函数;Flink 用 CARDINALITY;Hologres 用 ARRAY_LENGTH 并指定维度。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | SIZE(array_or_map) |
| Hologres | 需改写 | ARRAY_LENGTH(arr, 1) |
| StarRocks | 别名 | array_length(arr) / map_size(m) |
| Doris | 别名 | ARRAY_SIZE(arr) / MAP_SIZE(m) |
| Hive | 支持 | size(array_or_map) |
| Spark SQL | 支持 | size(expr) |
| Flink SQL | 别名 | CARDINALITY(array_or_map) |
SORT_ARRAY 数组排序
SORT_ARRAY 对数组元素排序。MaxCompute、Hive 和 Spark 用 SORT_ARRAY,Hologres、StarRocks、Doris 和 Flink 用 ARRAY_SORT。NULL 元素放在开头还是末尾、能否降序排列,各引擎不同;Spark 的 sort_array 和 array_sort 对 NULL 的处理也不一样。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | SORT_ARRAY(a[, isasc]) |
| Hologres | 需改写 | ARRAY_SORT(anyarray) |
| StarRocks | 需改写 | array_sort(array) |
| Doris | 需改写 | ARRAY_SORT(arr) |
| Hive | 支持 | sort_array(Array<T>) |
| Spark SQL | 支持 | sort_array(array[, ascendingOrder]) |
| Flink SQL | 需改写 | ARRAY_SORT(array[, ascending_order[, null_first]]) |
STR_TO_MAP 字符串转 Map
STR_TO_MAP 用两个分隔符把字符串拆成键值对,返回 Map。除 Hologres 外都同名可用,但默认的键值分隔符不同:MaxCompute 和 Flink 默认是等号,StarRocks、Doris、Hive 和 Spark 默认是冒号。迁移时建议把两个分隔符都写明。
| 引擎 | 支持 | 写法 |
|---|---|---|
| MaxCompute | 支持 | STR_TO_MAP([mapDupKeyPolicy,] text[, delimiter1[, delimiter2]]) |
| Hologres | 不支持 | — |
| StarRocks | 支持 | str_to_map(content[, delimiter[, map_delimiter]]) |
| Doris | 支持 | STR_TO_MAP(str[, pair_delimiter[, key_value_delimiter]]) |
| Hive | 支持 | str_to_map(text[, delimiter1, delimiter2]) |
| Spark SQL | 支持 | str_to_map(text[, pairDelim[, keyValueDelim]]) |
| Flink SQL | 支持 | STR_TO_MAP(string1[, string2, string3]) |