2021SC@SDUSC
山大软工实践hive(5)-逻辑优化(1)
逻辑优化,顾名思义,就是通过调整语句的执行顺序,或者优化语句,减少时间、内存上的开销。许多思路与普通数据库的查询优化一样。根据这一阶段输入输出都是DAG,可以认为是用过调整DAG的结构达到目的。
几种方式
参考他人博客有以下几种方式
谓词下推
让选择运算优先执行,比如 select 1 from a join b on a.id=b.id where a.id=5 and b.id>10,会优先执行a.id=5与b.id>10,然后再进行join操作,因为join操作的时间复杂度是O(nlogn)的,选择运算为O(n),有理由减少JOIN的输入数据量。比如下图把过滤操作提前,让JOIN可以处理更少的数据,用更少的空间

常量折叠
在涉及常量的运算上简化
1.如果表达式全为常量,就可把结果先算出来替代表达式
2.and or运算的逻辑短路
3.表达式中的常量传递。如a=1,b=a,c=b,即可直接给b,c赋值为1
1,3和代码编译成汇编语言一个思路,把可以替代的替代了;2是在hql中的and or实现逻辑短路,是必须实现的
合并RS算子
DAG上同一路径上的符合条件的两个RS算子合并成一个
要同时满足排序,分组,升降序上,key元素组的包含关系(如a,b,c 包含a,b 不包含 a,d)然后
1.排序上合并为要求更精密的一个。比如算子分别以(a,b),(a)排序,则路径上前面的算子以(a,b)排序,后面的算子删除
2.分组上合并为要求更模糊的。比如以(a,b),(a)分组,则路径上前面

本文详细介绍了Hive的逻辑优化过程,包括谓词下推、常量折叠、RS算子合并、Join顺序优化、Select优化等策略,旨在减少时间、内存开销。例如,谓词下推能提前过滤数据,Join顺序优化则将大表置于最后以降低内存需求。此外,还探讨了如何通过sortby和groupby避免单个reducer处理所有数据,提高执行效率。Hive的逻辑优化涉及到多个类和方法,如Optimizer和LogicalPlanOptimizer,通过源码分析可进一步理解其实现机制。
最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



