SparkSQL_数组排序函数 array_sort用法详解

SparkSQL_数组排序函数 array_sort用法详解

在这里插入图片描述

官网:https://spark.apache.org/docs/latest/api/sql/index.html#array_sort

在这里插入图片描述

array_sort(expr, [func])
参数类型必须说明
exprARRAY<T>要排序的数组
funcLambda 函数 (T, T) -> INT自定义比较函数(可选)

默认排序行为(不传 func

如果不提供比较函数,array_sort 会:

  • 升序 排序
  • NULL 值排在最后
  • 对于 float/double 类型,NaN > 任何非 NaN 值

1:基本排序(升序)

SELECT array_sort(array(5, 6, 1)) AS sorted;
-- 输出: [1, 5, 6]

在这里插入图片描述


2:字符串排序(字典序)

SELECT array_sort(array('bc', 'ab', 'dc')) AS sorted;
-- 输出: ["ab", "bc", "dc"]

在这里插入图片描述


3:带 NULL 的排序

SELECT array_sort(array('b', 'd', null, 'c', 'a')) AS sorted;
-- 输出: ["a", "b", "c", "d", null]

在这里插入图片描述


自定义比较函数格式:

array_sort(array_col, (left, right) -> 
  CASE 
    WHEN left < right THEN -1
    WHEN left > right THEN 1
    ELSE 0
  END
)

比较函数返回值含义:

返回值含义
负数left < right
0left == right
正数left > right

⚠️ 如果比较函数返回 NULL,会抛出错误!


1:降序排序(数字)

SELECT array_sort(
  array(5, 6, 1),
  (left, right) -> CASE 
    WHEN left < right THEN 1
    WHEN left > right THEN -1
    ELSE 0
  END
) AS sorted_desc;
-- 输出: [6, 5, 1]

在这里插入图片描述


2:字符串按长度排序(长的在前)

SELECT array_sort(
  array('a', 'bb', 'ccc', 'dddd'),
  (left, right) -> CASE 
    WHEN length(left) < length(right) THEN 1
    WHEN length(left) > length(right) THEN -1
    ELSE 0
  END
) AS sorted_by_length;

在这里插入图片描述


3:字符串按字典序降序排序

SELECT array_sort(
  array('bc', 'ab', 'dc'),
  (left, right) -> CASE 
    WHEN left < right THEN 1
    WHEN left > right THEN -1
    ELSE 0
  END
) AS sorted_desc;
-- 输出: ["dc", "bc", "ab"]

在这里插入图片描述


4:处理 NULL 值的自定义排序(把 NULL 放在最前面)

SELECT array_sort(
  array('b', 'd', null, 'c', 'a'),
  (left, right) -> CASE 
    WHEN left IS NULL AND right IS NULL THEN 0
    WHEN left IS NULL THEN -1
    WHEN right IS NULL THEN 1
    WHEN left < right THEN -1
    WHEN left > right THEN 1
    ELSE 0
  END
) AS sorted_null_first;
-- 输出: [null, "a", "b", "c", "d"]

在这里插入图片描述


整理不易 多多支持呀~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喻师傅

谢谢您!我会继续努力创作!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值