Hive中的几种排序方式比较分析

HIVE 中有多种排序方式,他们的实现机制和效率都是不同的,在使用时要根据具体的场景来选择合适的排序函数。

简介

1、ORDER BY
ORDER BY 是最常见的排序方式,它对整个结果集进行全局排序,保证输出结果按指定的列排序。
特点:

  • 全局排序:ORDER BY 会对整个数据集进行全局排序。
  • 数据倾斜问题:因为是全局排序,所有的数据会被聚集到一个节点上进行排序。如果数据量非常大,可能会导致性能问题或者 OOM(内存溢出)。
  • 操作慢:由于是全局排序,Hive 会在排序过程中进行数据的完全拉取和传输,因此处理时间较长。
  • 适用场景:适用于数据量相对较小或者排序后的数据能够被全局聚集的情况。

2、SORT BY
SORT BY 是局部排序,它对每个 reducer 的结果进行排序,而不是对整个数据集进行全局排序。
特点:

  • 局部排序:每个 reduce 节点上的数据会被排序,但不会保证所有数据的全局排序。即每个 reduce 节点对它所处理的数据进行排序,而不同 reduce 节点之间的数据顺序没有保证。
  • 性能较好:由于每个 reduce 节点只负责局部排序,数据传输和排序的开销通常比全局排序小,因此比 ORDER BY 更加高效。
  • 适用场景:当对排序的精确要求较低,且数据量较大时,使用 SORT BY 会更合适。

3、DISTRIBUTE BY + SORT BY
DISTRIBUTE BY 并不直接用于排序,它是用来将数据分发到不同的 reducer 上。通常与 SORT BY 一起使用,通过 DISTRIBUTE BY 控制数据的分布,以优化排序。
特点:

  • 数据分发:DISTRIBUTE BY 会将数据根据指定的列值进行分发,每个 reducer 接收特定范围的数据。它并不会对数据本身进行排序。
  • 与 SORT BY 配合使用:通常情况下,DISTRIBUTE BY 用来将数据分配到不同的 reducer 后,每个 reducer 再执行 SORT BY 来对数据进行局部排序。
  • 数据分布均匀:它可以通过合理的分发策略来避免数据倾斜,避免某些 reduce 节点处理过多的数据,提升执行效率。

4、窗口函数排序(Window Function)
窗口函数排序是通过 OVER 子句和 ORDER BY 来进行局部排序的,它允许我们在查询结果集中对每一行数据应用一个排序顺序,而不是全局排序。
特点:

  • 局部排序:在窗口函数中,ORDER BY 主要用于对每个分组内的数据进行排序。它并不会改变整个结果集的顺序,而是为每个分组内的行提供排序。
  • 灵活性高:可以在 PARTITION BY 子句中定义分组,同时可以在 ORDER BY 子句中指定排序规则。每个分组内的行可以根据某种顺序计算累计值、排名等。
  • 性能影响较小:窗口函数的排序主要是在每个分区内进行,不会像 ORDER BY 那样对整个数据集进行全局排序,性能较好。

比较分析:

特性 ORDER BY SORT BY DISTRIBUTE BY 窗口函数排序(OVER
排序方式 全局排序 局部排序 数据分发,不排序 局部排序(每个分区内排序)
性能 性能较差,可能导致数据倾斜 性能较好,适用于大数据量 性能较好,避免数据倾斜 性能较好,局部排序且不影响全局
数据量适应性 适用于小数据集 适用于大数据集 适用于需要分发数据的场景 适用于需要按分组排序的场景
适用场景 小数据集,或需要严格排序 大数据集,局部排序即可 数据分发并结合 SORT BY 使用 分组内排序、排名、累计计算等
排序的粒度 对整个结果集排序 每个 reducer 局部排序 不排序,仅分发数据 每个分组内排序

Hive中的几种排序方式比较分析
https://www.lihaibao.cn/2025/02/12/Hive中的几种排序方式比较分析/
Author
Seal Li
Posted on
February 12, 2025
Licensed under