HIVE语法优化之Join优化

桶用两表关联字段,MapJoin时需要将小表填入内存,这时候,分桶就起到了作用
一个stage阶段代表一个mr执行,好几个MR,会吧每一个MR的结果都压缩

Mysql 慢查询
如果sql语句执行超过指定时间,定义该sql为慢查询,存储日志,
查问题: SQL日志,模拟慢SQL 然后查询执行计划

分组聚合
就是在Map后直接对他进行聚合,而不是在reduce时聚合
在这里插入图片描述
默认开启map端聚合
前提条件:
抽样校验 看样品聚合率是否达到要求,将数据会拿到内存聚合,
如果达不到要求,就不继续聚合,然后最后的比例,聚合
最后这个参数有疑问
给聚合留的内存的百分比

Join优化
Reduce Join
优点:使用范围广
缺点:性能慢
最稳定的,但是性能是最慢的
注意. 读表的时候也不一定是一个maptask完成,多个一起,加快速度
在这里插入图片描述

map 负责读数据 资源整合 key关联字段 v Bean
根据数据来源区分,
如果关联字段相同, Bean添加即可 1个
因为是按Key分组
所以不是一个JOIN语句必须对应一个Common Join

Map Join
特点:针对Common join的优化
使用前提:一张大表与一张小表
概况: job1:小表制作为hash table 上传分布式缓存.(因为分布式,都在内存中找数据)
job2:从缓存中读取小表数据,缓存在Map Task中,扫描大表.
思考:为什么需要大表对小表? 小表缓存快, 其实大表可以分成小表,分部加载即可
优点:
缺点:
在这里插入图片描述

在这里插入图片描述

Bucket Map join
将大表进行分割成小表
注意:如果2个都是分桶表,且关联是分桶字段,一张的分桶数量是另一张的整数倍。就能保证join的分桶有明确的关联
在这里插入图片描述
因为都是哈希,所以相等或者倍数关系对应是比较符合的
这时候缓存的是桶比较少的表
mapper个数对应桶的最多数。
为什么这么对应?
这样mapper多,快 ,而且占用内存小
在这里插入图片描述

Sort Merge Bucket Map Join
在这里插入图片描述
比桶Map join多一个排序
HASH join 是什么?

排序后的表为什么快
不排序的话,join时每次比对都需要整表比对
在这里插入图片描述
在这里插入图片描述
这个数据不需要进入内存加载,直接在磁盘进行操作了,因为他是顺序读取,效率也很高,不需要加入内存读取来提高效率.
节省内存

1.什么时候不知道表大小 子查询
2.对未知大小的表如何map join选择存储的表
在这里插入图片描述
在这里插入图片描述
为什么3个?按理说不是2个么

全连接需要全扫描
left right 都只需要大表扫描 , 这里也 是问题 为什么 部分不用全表扫描

都未知走全部,其实就是搜索
大表候选人大小均已知,

最优map join 计划
多表(结合)

在这里插入图片描述
第一次判断,是判断大小第一次

在这里插入图片描述
不理解
哪来2个job

CBO 代价优化 忽略mapjoin

Sort Merge Bucket Map join
问题:分桶表的插入等会看一下
只跑了一个job
为什么?

请添加图片描述
假设abc 三个表
a为主表 b c 为小表
m c 就是子任务 ,那么,子任务是map join么? c小于size
然后b+c 小于size 就说明 6成立 所以就是一个子任务 那么 map join 和子任务map join合并一个任务
就是一直重复
4->a+ n(子表的其中一个)->5 /8
其实就是
主表和小表,一个一个去结合判断,走流程

在这里插入图片描述

### Hive 中排序的相用法 在 Hive 中,排序是一个常见的需求,通常通过 `ORDER BY` 和 `SORT BY` 来实现。以下是于这两种方法的具体说明以及一些解决方案。 #### ORDER BY 的使用 `ORDER BY` 是一种全局排序的方式,它会对整个查询的结果集按照指定的列进行升序或降序排列。需要注意的是,由于其全局性质,在执行过程中可能会引发较大的性能开销,尤其是在大规模数据场景下[^1]。 ```sql SELECT column_name(s) FROM table_name ORDER BY column_name ASC|DESC; ``` 此语法中的 `ASC` 表示升序,默认情况下如果未指明顺序则默认为升序;而 `DESC` 则表示降序。 #### SORT BY 的应用 不同于 `ORDER BY` 的全表范围排序,`SORT BY` 只会在每个 reducer 内部完成局部排序工作。这意味着最终输出可能并非完全有序,但如果仅需每部分内部保持一定次序,则这种方法更为高效且资源消耗较少[^4]。 ```sql SELECT column_name(s) FROM table_name DISTRIBUTE BY another_column SORT BY column_name ASC|DESC; ``` 这里引入了一个额外的键字——`DISTRIBUTE BY`,用来定义如何分配记录到不同的 reduce task 上面去。合理设置该参数可以帮助平衡负载并进一步提升效率。 #### 使用窗口函数辅助排序 当遇到复杂业务逻辑下的排序需求时,可以考虑利用 Hive 提供的强大功能之一—窗口函数(window function),如之前提到过的 row_number() over(partition by ... order by ...) 。这允许我们在分组的基础上再做独立排序,并赋予每一行唯一编号。 ```sql SELECT *, ROW_NUMBER() OVER (PARTITION BY group_col ORDER BY sort_col DESC) as rn FROM your_table; ``` 上述例子展示了基于某个字段(`group_col`)划分后的子集中按另一字段(`sort_col`)降序排列的过程,同时给定相应排名标记(rn)。 ### 解决排序过程中的常见问题 对于大数据量情况下的排序操作经常会面临诸如内存溢出等问题。此时可以从以下几个方面着手改进: - **调整输入文件大小**:尽可能减少单个 map/reduce 输入文件尺寸至合适区间内,避免因过大而导致计算失败的情况发生。 - **启用压缩机制**:通过对中间结果实施有效压缩措施降低 I/O 成本,提高整体作业运行速度[^3]。 - **优化 join 操作**:针对存在连接(join)运算的任务,应仔细评估参与联双方的数据分布特性是否存在明显偏差(即所谓“热点”)现象,并采取适当策略加以缓解,例如重新设计分区键或是采用 skew join 技术等手段应对潜在的数据倾斜风险[^5]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值