首页 / 数组和 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]) | isasc 默认为 True,即升序,传 False 时降序。NULL 视为最小值。 | 官方文档 |
| Hologres | 需改写 | ARRAY_SORT(anyarray) | 只有升序。V1.1.46 起支持 TEXT 数组,但会先转成 INT8 再排序;V1.3.18 起 TEXT 数组按字典序排序,并支持 INT4、INT8、FLOAT4、FLOAT8 和 BOOLEAN 数组。 | 官方文档 |
| StarRocks | 需改写 | array_sort(array) | 升序排列,NULL 放在开头。4.0 起可以传 Lambda 比较函数自定义顺序。 | 官方文档 |
| Doris | 需改写 | ARRAY_SORT(arr) | 升序排列,NULL 放在开头;降序用 ARRAY_REVERSE_SORT。也可以传 Lambda 表达式自定义排序。 | 官方文档 |
| Hive | 支持 | sort_array(Array<T>) | Hive 0.9.0 起提供,只能升序。 | 官方文档 |
| Spark SQL | 支持 | sort_array(array[, ascendingOrder]) | Spark 1.5.0 起提供。升序时 NULL 在开头,降序时 NULL 在末尾。另有 array_sort,它把 NULL 放在末尾,3.0.0 起支持比较函数。 | 官方文档 |
| Flink SQL | 需改写 | ARRAY_SORT(array[, ascending_order[, null_first]]) | 默认升序且 NULL 在开头。可以分别指定升降序和 NULL 的位置。任一参数为 NULL 时返回 NULL。 | 官方文档 |
迁移注意事项
- Spark 有两个排序函数:sort_array 升序时把 NULL 放在开头,array_sort 把 NULL 放在末尾。从 MaxCompute 或 Hive 迁移时应使用 sort_array,结果才一致。
- 降序的写法不同:MaxCompute 和 Spark 传第二个参数,Flink 传 ascending_order,Doris 用 ARRAY_REVERSE_SORT,Hive 和 Hologres 的函数只能升序。
- Hologres V1.3.18 之前会把 TEXT 数组转成 INT8 再排序,字符串内容不是数字时结果可能不符合预期,使用前先确认实例版本。
- 用排序后的数组做字符串拼接或比较时(例如 concat_ws(',', sort_array(tags))),NULL 的位置不同会直接改变结果。
示例
把标签数组排序后拼接成字符串
SELECT user_id, CONCAT_WS(',', SORT_ARRAY(tags)) AS tag_str FROM user_tags;SELECT user_id, ARRAY_TO_STRING(ARRAY_SORT(tags), ',') AS tag_str FROM user_tags;SELECT user_id, array_join(array_sort(tags), ',') AS tag_str FROM user_tags;SELECT user_id, ARRAY_JOIN(ARRAY_SORT(tags), ',') AS tag_str FROM user_tags;SELECT user_id, concat_ws(',', sort_array(tags)) AS tag_str FROM user_tags;SELECT user_id, concat_ws(',', sort_array(tags)) AS tag_str FROM user_tags;SELECT user_id, ARRAY_JOIN(ARRAY_SORT(tags), ',') AS tag_str FROM user_tags;