hive多表查询的条件写在join里好还是用子查询

问题中这一块主要是和hive中 join 的谓词下推优化相关。
不同的hive版本,对谓词下推的优化程度不一样。
关于inner join: 不管是join中的谓词,还是join之后的谓词 都会进行下推。
另外,在left join, right join, full outer join 中,hive1.x与hive2.x 的版本 的优化效果也不一样。hive2.x的CBO做了更多优化。
这一块的细节很多,我写过两篇文章,很仔细的分析了谓词下推,分享一下,希望能对你有帮助:
从一个sql引发的hive谓词下推的全面复盘及源码分析(上)从一个sql引发的hive谓词下推的全面复盘及源码分析(下) 【hive多表查询的条件写在join里好还是用子查询】

■网友
一样的,谓词下推都会做的
■网友
分情况吧。
1、如果不存在数据倾斜,应该是第一种,从执行逻辑计划来看,这种方式会在reduce时候过滤掉不满足on 条件中的数据,而第二种方式在join之前会有一次数据读取处理过程,多一次磁盘IO过程,因此第一种方式时间短一些
2、若是join的两张表在关联时因笛卡儿积产生数据倾斜,第一种方式处理时间估计就比较久了,on条件过滤也是挽救不了,需要采取其他的方式进行优化
HQL编写时为了处理数据,在了解数据的基础上对语句优化更有方向

■网友
对比查询计划
■网友
第二种比较快
■网友
explain 对比两个语句的执行计划;
explain DEPENDENCY 对比两个语句的输入数据;
发现两个语句的执行计划和最终花费时间基本一样 因为优化器会做谓词下推,最终的执行速度是一样的


    推荐阅读