hive中的Sort By, Order By, Distribute By, and Cluster By

本文介绍了SQL查询中的SORTBY、ORDERBY、DISTRIBUTEBY及CLUSTERBY子句的使用方法及其区别。通过具体示例说明如何利用这些子句对查询结果进行排序、分区和全局排序,帮助读者理解不同场景下选择合适子句的重要性。

使用的表格

下面是文中使用到的数据

SalesYear	Amount
2017	100
2018	200
2019	300
2020	400
2017	500
2018	600
2019	700
2020	800

1 SORT BY

SORT by子句对每个reducer的数据进行排序。结果,如果我们有N个减速器,则输出中将有N个排序文件。这些文件的数据范围可以重叠。同样,输出数据也不是全局排序的,因为配置单元会根据SORT BY子句中使用的键列对行进行排序,然后再将它们提供给减速器。SORT BY子句的语法如下:

SELECT Col1, Col2,……ColN FROM TableName SORT BY Col1 <ASC | DESC>, Col2 <ASC | DESC>,. ColN <ASC | DESC>
SELECT SalesYear, Amount
FROM tbl_Sales 
SORT BY SalesYear;

现在,假设我们有两个化简器来执行此查询。因此,在最终输出中,我们将基于每个化简器的SalesYear列值,获得两个本地排序的文件。这意味着文件仅按reducer进行排序,而不是全局。请注意,最终输出数据不是全局排序的,并且可能具有重叠的数据范围。

带有2个reducers的上述查询的输出将如下所示:
在这里插入图片描述

2 、ORDER BY

ORDER BY子句对数据进行全局排序。因为它确保了数据的全局排序,所以所有数据仅需要从单个reducer传递。结果,order by子句仅输出一个文件。将所有数据都放在一个reducer上可能会成为性能杀手,尤其是在我们的输出数据集非常大的情况下。因此,我们应该始终避免在配置单元查询中使用ORDER BY子句。但是,如果需要强制对数据进行全局排序,而输出数据集不是那么大,则可以使用此配置单元子句对最终数据集进行全局排序。

SELECT Col1, Col2,……ColN FROM TableName ORDER BY Col1 <ASC | DESC>, Col2 <ASC | DESC>,. ColN <ASC | DESC>
SELECT SalesYear, Amount
FROM tbl_Sales 
SORT BY SalesYear;

在这里插入图片描述

3、DISTRIBUTE BY

DISTRIBUTE BY子句用于在缩减器之间分配输入行。它确保相同键列的所有行都将到达相同的reducer。因此,如果需要对某个键列上的数据进行分区,则可以在配置单元查询中使用DISTRIBUTE BY子句。但是,DISTRIBUTE BY子句不会在reducer级别或global上对数据进行排序。同样,相同的键值可能不会在输出数据集中彼此相邻放置。

结果,DISTRIBUTE BY子句可以输出N个未排序的文件,其中N是查询处理中使用的化简器数量。但是,输出文件不包含重叠的数据范围。

配置单元中DISTRIBUTE BY子句的语法如下:

SELECT Col1, Col2,……ColN FROM TableName DISTRIBUTE BY Col1, Col2,.. ColN
SELECT SalesYear, Amount
FROM tbl_Sales 
DISTRIBUTE BY SalesYear;

在这里插入图片描述

4、CLUSTER BY

CLUSTER BY子句是DISTRIBUTE BY和SORT BY子句一起的组合。这意味着CLUSTER BY子句的输出等效于DISTRIBUTE BY + SORT BY子句的输出。CLUSTER BY子句根据键列分配数据,然后通过将相同的键列值彼此相邻来对输出数据进行排序。因此,CLUSTER BY子句的输出在reducer级别排序。结果,我们可以获得N个排序的输出文件,其中N是查询处理中使用的化简器数。此外,CLUSTER by子句可确保我们获取不重叠的数据范围进入最终输出。但是,如果查询仅由一个reducer处理,则输出将等同于ORDER BY子句的输出。

SELECT Col1, Col2,……ColN FROM TableName CLUSTER BY Col1, Col2,.. ColN
SELECT SalesYear, Amount
FROM tbl_Sales 
CLUSTER BY SalesYear;

在这里插入图片描述

比较

在这里插入图片描述

### Order By - **作用**:`Order By` 用于对查询结果进行全局排序,是一种牺牲性能的绝对排序,会对整个数据集进行排序,保证最终输出结果是按照指定列完全有序的。 - **用法**:语法格式为 `SELECT column1, column2, ... FROM table_name ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...;`。示例如下: ```sql SELECT * FROM employee ORDER BY salary DESC; ``` ### Sort By - **作用**:`Sort By` 是兼顾性能的局部排序,它只在每个 `Reduce` 任务内进行排序,不能保证全局有序,但能在每个分区内有序,能提高排序性能。 - **用法**:语法格式为 `SELECT column1, column2, ... FROM table_name SORT BY column1 [ASC|DESC], column2 [ASC|DESC], ...;`。示例如下: ```sql SELECT * FROM employee SORT BY age ASC; ``` ### Distribute By - **作用**:`Distribute By` 是数据分布的底层控制,用于控制数据在不同 `Reduce` 任务之间的分布,将具有相同值的记录分发到同一个 `Reduce` 任务中处理。 - **用法**:语法格式为 `SELECT column1, column2, ... FROM table_name DISTRIBUTE BY column1;`。通常 `Distribute By` 要和 `Sort By` 结合使用,且 `Distribute By` 语句要写在 `Sort By` 语句之前。示例如下: ```sql SELECT * FROM employee DISTRIBUTE BY department SORT BY salary DESC; ``` ### Cluster By - **作用**:`Cluster By` 是特定场景的语法糖,相当于 `Distribute By` 和 `Sort By` 使用相同列的简写形式,它既对数据进行分区,又在每个分区内进行排序。 - **用法**:语法格式为 `SELECT column1, column2, ... FROM table_name CLUSTER BY column1;`。示例如下: ```sql SELECT * FROM employee CLUSTER BY department; ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值