SQL 方言通

首页 / 数组和 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])

其他分类

最近核对: