本文首发于体内互联网技术微信公众号
引用>
李勇目录:
1。左表加入后的条件下推
2。左表中加入条件不下推
3。右表中加入条件下推
4。右表中加入条件不下推
5。总结在《SparkSql连接查询中的谓词下推处理(一)》中,我们介绍了一些基本的概念,并对内连接查询时的一些基本下推规则进行了分析。
本篇文章要介绍的是——外连接查询中的谓词下推规则,这相比内连接中的规则要复杂一些,不过使用简单的表格来进行分析也是可以分析清楚的。先上表:
我们以左外连接查询为例,先总结规矩如下:
接下来对这个表格中的规则进行详细的分析。
<强> <强> 1。左表加入后的条件下推强> 强>
查询语句如下:
前文有提到,对于<强>加入强>后条件,如果放在<强>乔* * 强劲> * *操作后执行,是可以作为正确结果进行比对的。那么先对两表进行左连接,结果如下:
然后使用<强> LT.id> 1 强>这个<强>加入强>后条件进行过滤,结果如下:
来分析一下<强> LT.id> 1 强>下推到左表进行数据过滤的结果,经过<强> LT.id> 1 >强过滤后,左表变为:
此时再和右表进行左连接,左表强> <强> id为2的行,在右表中能找到强> <强> id为2的行,则连接结果如下:
可见,两种处理方法结果一致。条件下推过滤了左表整整50%的数据(相当牛,虽然只过滤了一条)。究其原因,是因为在<强> SparkSQL 强>中,把以上的查询解析成了如下的子查询:
这是一个非相关子查询,即完全可以先完成子查询,再完成父查询,子查询在查询过程中和外部查询没有关联关系。
<强> 2。左表中加入条件不下推强>
查询语句如下:
来看看不下推的情况下计算出的正确结果,<强>加入>强过程如下:
<强>第一步:强>左表强> <强> id为1的行在右表中能找到相等的<强> id >强劲,但是左表的强> <强> id为1,是不满足第二个<强>加入>强条件(<强> LT.id> 1 强>)的,所以左表这一条相当于没有和右表<强>加入强>上,所以左表的值<强>价值>强保留,而右表的价值<强> 强>为<强>空强>(你没满足<强> 强>中加入条件没<强>加入强>上还把你的值保留,给我搞个空值?没办法,就是这么任性)。
<强>第二步:强>左表强> <强> id为2的行在右表中能找的到,而且左表强> <强> id为2的行的<强> id 强>大于1,两个<强>加入>强条件都满足,所以算是和右表<强>加入>强上了,所以左表和右表的<强> 强>价值都保留。最终的查询结果如下:
那么如果把“<强> LT.id> 1 强>“这个条件下推到做表,会得到什么结果呢?
首先左表经过“<强> LT.id> 1 强>“过滤后,如下:
【大数据】SparkSQL连接查询中的谓词下推处理(二)