SQL中是否有对单个字符串元素排序并聚合分数的函数?
问题描述
现有数据表如下:
| element | score |
|---|---|
| ABC | 50 |
| BAC | 10 |
| CBA | 30 |
| XYZ | 115 |
| ZXY | 25 |
需要实现:对每条记录的element字段字符串按单个字符排序,将排序后结果相同的记录的score字段求和,最终输出:
| element | score |
|---|---|
| ABC | 90 |
| XYZ | 140 |
当前使用的字符串排序实现层级冗余、开销较高,代码如下:
SELECT element, CONCAT_WS('', sorted_chars) AS sorted_input FROM (SELECT element, sort_array(collect_list(char), true) AS sorted_chars FROM (SELECT element, explode(split(element, '')) AS char FROM table) t GROUP BY element) t
优化实现方案
针对Spark SQL 3.0+版本
利用原生array_sort函数直接处理拆分后的字符数组,省去拆分再聚合的冗余步骤,代码更简洁高效:
SELECT first(element) AS element, SUM(score) AS score FROM ( SELECT element, score, -- 拆分字符串为数组→排序→拼接为有序字符串,作为分组依据 concat_ws('', array_sort(split(element, ''))) AS sorted_element FROM your_table_name ) t GROUP BY sorted_element
针对Hive SQL版本
Hive无array_sort,但可直接用sort_array处理拆分后的数组,同样能简化逻辑:
SELECT first(element) AS element, SUM(score) AS score FROM ( SELECT element, score, concat_ws('', sort_array(split(element, ''))) AS sorted_element FROM your_table_name ) t GROUP BY sorted_element
优化核心点
- 减少子查询层级:原方案需3层嵌套,优化后仅需2层,逻辑更直观
- 避免无效数据膨胀:原方案通过
explode拆分单条记录为多条,再用collect_list聚合,会产生额外数据处理开销;优化方案直接对数组排序,无数据拆分聚合的冗余操作 - 原生函数性能更优:
array_sort/sort_array为引擎原生优化的排序函数,性能优于sort_array(collect_list(...))的组合
内容的提问来源于stack exchange,提问作者Ritwik Sinha
相关产品推荐
相关产品推荐

