SparkSQL中4个排序的区别

常用的四个排序BY

  1. ORDER BY
  2. SORT BY
  3. DISTRIBUTE BY
  4. CLUSTER BY

此文只是结合官方文档和案例做一下说明下功能

数据集描述 

数据如上所示,并手动将分区数设定在2个,默认以 id 字段作为分区依据

原始数据分布

情况如下

 相同id的数据都分到了同一个分区内

ORDER BY子句

官网说明ORDER BY Clause - Spark 3.3.1 Documentation

简述: order by保证了输出的全局有序,通常用于返回结果数据时使用

在使用 [ ORDER BY id ] 的情况下的分布情况

 可以看到数据分区数不变,并且整体以id来做升序处理的

SORT BY子句

官网说明: SORT BY Clause - Spark 3.3.1 Documentation

简述: sort by是用于在每个分区内部做排序

在使用 [ sort by age ] 的情况下的分布情况

可见它与原始数据相比,并不影响分区之间的分配情况,仅仅在是每个分区内对每行进行了针对 age字段的升序处理

DISTRIBUTE BY子句

官网说明DISTRIBUTE BY Clause - Spark 3.3.1 Documentation 

简述: 通常用于根据输入的表达式来对数据进行重分区,分区内不会进行重排序

在使用 [ distribute by age ] 下的分布情况

 很明显的看出,相比原数据集, distribute之后的数据在分布上有了很大的不同,相同age的数据被shuffle到了一个分区内

这个子句也通常可以用于解决分区间数据倾斜的情况

比如使用 distribute by round(rand(100))

就可以让数据随机进入不同的分区来让数据分布均衡

CLUSTER BY子句

官网说明CLUSTER BY Clause - Spark 3.3.1 Documentation

简述: 有两个操作,首先对数据进行重分区,然后对每个分区内的数据进行排序

语义上等同于 先进行 DISTRIBUTE BY 再进行 SORT BY同一个排序表达式

在使用 [ cluster by age ] 下的数据分布情况

 明显看出数据针对 age字段的值进行了重分区,并且分区内都按age的升序序列来排序

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值