SparkSQL中的Sort实现(二)

SparkSQL中的Sort实现(二)

上节说到SparkSQL中将Sort分为两部分:第一部分是基于boundary的range repartition,通过采样确定每个partition的上下界,然后将数据按照上下界重新分区;第二部分呢,就是在分区内将数据进行排序。完成这两步之后,整张表中的数据就变成有序的了。

分区内的排序是借助UnsafeExternalRowSorter来完成的,而它其中又嵌套了一个UnsafeExternalSorter,排序的主要逻辑靠后者来完成,前者主要做一些转换和适配工作。

用到的数据结构

UnsafeInMemorySorter

这是一个用来存储记录数据的地址和prefix的Sorter。其实质上是一个LongArray,奇数为存储记录的地址,偶数位置存储记录的prefix。地址和prefix都是Long类型。

对记录进行排序时,首先判断两条记录的prefix是否相等,如果根据prefix就可以判断出两条记录的大小,那么直接返回结果。否则从相应的地址中拿出两条记录进行进一步的比较。相对于真实存储的记录来说,他们的地址和prefix占用的空间都比较小,在比较时遍历较小的数据结构更有利于提高cache命中率。

比较的详细过程在后文描述。

另外值得注意的一点时,其存储底层LongArray只有一部分内存实际被存储使用,另外一部分是给排序预留的,预留的空间比例是1/2(Radix Sort)或者1/3(Tim Sort)。

UnsafeExternalSorter

首先,这是一个可以独立申请内存(当然也包括释放内存和spill到磁盘)的MemoryConsumer。有一个链表用来保存其使用到的MemoryBlock (allocatedPages),另外一个链表维护spill到磁盘的信息(spillWriters),例如溢出文件路径、blockId、溢出的记录数等。并有各种数据结构跟踪当前的内存使用和分配情况。

其次,这个数据结构的主要功能用于给记录排序。主要的辅助类在上面已经提到了,是一个基于地址和prefix的内存排序器。

这里面用到的其他辅助数据结构有:

prefix comparator

一个

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值