Hive的Sort By与Distribute By

本文介绍了如何在Hive中利用SortBy优化大数据集排序效率,DistributeBy用于控制行分布和聚集操作,以及ClusterBy的合并排序功能。重点讲解了如何设置reduce个数、分区策略和注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

每个 Reduce 内部排序(Sort By)

Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排序,此时可以使用 sort by。

Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集来说不是排序。

1)设置 reduce 个数

hive (default)> set mapreduce.job.reduces=3;

2)查看设置 reduce 个数

hive (default)> set mapreduce.job.reduces;

3)根据部门编号降序查看员工信息

hive (default)> select * from emp sort by deptno desc;

4)将查询结果导入到文件中(按照部门编号降序排序)

hive (default)> insert overwrite local directory '/opt/module/data/sortby-result' select * from emp sort by deptno desc;

分区(Distribute By)

Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition(自定义分区),进行分区,结合 sort by 使用。

对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果。

1)案例实操:

(1)先按照部门编号分区,再按照员工编号降序排序。

hive (default)> set mapreduce.job.reduces=3;
hive (default)> insert overwrite local directory '/opt/module/data/distribute-result' select * from emp distribute by deptno sort by empno desc;

注意:

➢ distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后,余数相同的分到一个区。

➢ Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前

Cluster By

当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。

cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序排序,不能指定排序规则为 ASC 或者 DESC。

(1)以下两种写法等价

hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;

注意:按照部门编号分区,不一定就是固定死的数值,可以是 20 号和 30 号部门分到一个分区里面去。

### Hive中`DISTRIBUTE BY`语句的正确语法和使用顺序 #### 正确语法 在Hive查询语句中,`DISTRIBUTE BY`用于指定如何将数据分发到Reducer。其基本语法如下: ```sql SELECT column1, column2... FROM table_name [DISTRIBUTED BY (column_list)] [SORT BY column_list] [LIMIT number]; ``` 需要注意的是,`DISTRIBUTE BY`通常会`SORT BY`一起使用来控制MapReduce作业中的分区和排序逻辑[^1]。 #### 使用顺序 按照Hive SQL的标准执行流程,各子句的处理顺序依次为:`FROM`, `WHERE`, `GROUP BY`, `HAVING`, `SELECT`, `DISTINCT`, `ORDER BY/SORT BY`, `LIMIT`。而`DISTRIBUTE BY`应当紧跟在`FROM`之后的数据源定义部分,并位于`SORT BY`之前。具体来说,在构建复杂的查询时,应遵循以下结构: - 数据来源 (`FROM`) - 过滤条件 (`WHERE`) - 聚合操作 (`GROUP BY`) 及过滤聚合后的结果(`HAVING`) - 选择字段 (`SELECT`) - 去重 (`DISTINCT`) - 分区 (`DISTRIBUTE BY`) - 排序 (`SORT BY`) - 结果截取 (`LIMIT`) 因此,`DISTRIBUTE BY`应该放置在整个查询接近尾部的位置,但在任何显式的全局排序指令如`ORDER BY`或局部排序指令如`SORT BY`之前。 #### 示例解释 下面给出一个具体的例子并加以说明: ```sql SELECT col1, SUM(col2) AS total_col2 FROM my_table GROUP BY col1 DISTRIBUTE BY col1 SORT BY col1 DESC; ``` 此SQL片段的作用是从表`my_table`读取数据,按列`col1`进行汇总计算得到每组内`col2`之和作为新列`total_col2`,接着依据`col1`值的不同把记录分配给不同的Reducer实例处理,最后在同一组内的输出上应用降序排列[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值