千家信息网

【大数据 】SparkSQL连接查询中的谓词下推处理(二)

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本文首发于 vivo互联网技术 微信公众号作者:李勇目录:1.左表 join 后条件下推2.左表join中条件不下推3.右表join中条件下推4.右表join中条件不下推5.总结在《SparkSql连
千家信息网最后更新 2025年02月01日【大数据 】SparkSQL连接查询中的谓词下推处理(二)

本文首发于 vivo互联网技术 微信公众号
作者:李勇

目录:
1.左表 join 后条件下推
2.左表join中条件不下推
3.右表join中条件下推
4.右表join中条件不下推
5.总结

在《SparkSql连接查询中的谓词下推处理(一)》中,我们介绍了一些基本的概念,并对内连接查询时的一些基本下推规则进行了分析。

本篇文章要介绍的是--外连接查询中的谓词下推规则,这相比内连接中的规则要复杂一些,不过使用简单的表格来进行分析也是可以分析清楚的。先上表:

我们以左外连接查询为例,先总结规矩如下:

接下来对这个表格中的规则进行详细的分析。

1.左表join后条件下推

查询语句如下:

前文有提到,对于join后条件,如果放在jo**in**操作后执行,是可以作为正确结果进行比对的。那么先对两表进行左连接,结果如下:

然后使用LT.id>1这个join后条件进行过滤,结果如下:

来分析一下LT.id>1下推到左表进行数据过滤的结果,经过LT.id>1过滤后,左表变为:

此时再和右表进行左连接,左表id为2的行,在右表中能找到id为2的行,则连接结果如下:

可见,两种处理方法结果一致。条件下推过滤了左表整整50%的数据(相当牛,虽然只过滤了一条)。究其原因,是因为在SparkSQL中,把以上的查询解析成了如下的子查询:

这是一个非相关子查询,即完全可以先完成子查询,再完成父查询,子查询在查询过程中和外部查询没有关联关系。

2.左表join中条件不下推

查询语句如下:

来看看不下推的情况下计算出的正确结果,join过程如下:

第一步:左表id为1的行在右表中能找到相等的id,但是左表的id为1,是不满足第二个join条件(LT.id>1)的,所以左表这一条相当于没有和右表join上,所以左表的值value保留,而右表的valuenull(你没满足join中条件没join上还把你的值保留,给我搞个空值?没办法,就是这么任性)。

第二步:左表id为2的行在右表中能找到,而且左表id为2的行的id大于1,两个join条件都满足,所以算是和右表join上了,所以左表和右表的value都保留。最终的查询结果如下:

那么如果把"LT.id>1"这个条件下推到做表,会得到什么结果呢?

首先左表经过"LT.id>1"过滤后,如下:

此时再和右表连接,左表id为2的行在右表中能找到,且满足"LT.id = RT.id AND LT.id > 1"这个join中条件,所以两表的value都被保留。左表中已经没有数据了,查询结束,查询结果如下:

这个查询结果和不下推的正确结果不一致,是个错误的结果,所以左表join中条件是不能下推进行数据过滤的。分析原因:主要是因为join中条件和join后条件对结果的处理方式不同,前者在不满足join条件时会保留一部分结果,而后者在不满足条件时任何东西都不保留。

3.右表join中条件下推

查询语句如下:

现在把RT.id>1这个右表join后条件下推,来过滤右表,过滤后如下:

然后左表再和右表进行左连接,流程如下:

第一步:左表id为1的行在右表中没有,此时左表值保留,右表为null

第二步:左表id位2的行在右表中有,并且RT.id大于1,两个join条件都满足,则左表和右表的值都保留。查询结果如下:

那么如果不下推(为了得到正确结果),来看看结果,流程如下:

第一步:左表id为1的行在右表中有,但是不满足第二个join条件,所以这行算是没join上,所以左表数据保留,右表为null

第二步:左表id为2的行在右表中有,也满足第二个join条件,所以左右表的数据都保留。

可见,右表join中条件下推不下推,结果一样,所以,干吗不下推?可以过滤掉一半的数据呢。SparkSQL中的等价处理语句是:

可以看出,也是解析成了一个非相关子查询来处理的。

4.右表join中条件不下推

这个应该是最违反常规理解的查询了,查询语句如下:

首先来看,join后条件不下推的情况,流程如下:

第一步:左表id为1的行在右表中可以找到,但是此时仅仅满足join条件,在使用where条件判断这条连接后数据时,发现右表的id不满足RT.id>1的条件,所以这条join结果不保留(注意:这里是不保留,全都不保留,左表右表都不保留,要跟上边的没join上而右表的值保留为null的情况区别开,这也是关键所在);

第二步:左表id为2的行和右表id为2的行join上了,同时也满足RT.id>1where条件。

这是一条符合语义的正确的查询结果。

好了,接下来看看右表join后条件下推的情况:

第一步:使用RT.id>1过滤右表,过滤后右表只剩一行id为2的行;

第二步:左表id为1的行在过滤后的右表中没有,此时左表值保留,右表值为null

第三步:左表id为2的行在右表中有,此时左表值保留,右表值也保留。

结果如下:

很明显这其实是一个错误的结果。

总结

至此,左连接查询的四条规则分析完了。可以看出,在SparkSQL中对于外连接查询时的过滤条件,并不能在所有情况下都用来进行数据源的过滤,如果使用得当会极大的提升查询性能,如果使用不当,则会产生错误的查询结果,而这种错误结果又不易发觉,所以使用时要格外小心。

查询 结果 条件 中条 数据 分析 处理 情况 规则 语句 错误 流程 谓词 一致 接下来 两个 原因 表格 过程 这是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 服务器里面打不开网站 清华远程服务器 安卓开发软件开发方案报价 软件开发中的pl Mac下的win可以装数据库吗 简述数据库技术有哪些应用 网络安全50题答案 网络安全真正龙头股票是哪只 数据库中包含hello的查询 数据库怎么降安全性 淄博采购管理软件开发公司 网络安全所长 服务器怎么解除角色永久禁用 多台服务器布置ngnix 数据库备份还原软件完整最新版 什么漏洞网络安全领域已被发现 数据库大量数据快速查询 网络安全专家申报表中从事工作情况怎么写 中国网络技术有限公司0690 青岛蓝恩网络技术 判断数据库是否存在漏洞 网络安全中什么叫考试能力 青岛华晨软件开发公司 服务器2008还有哪些版本 青浦区网络软件开发质量保证 塔科夫服务器延迟多少能用 有哪些网络安全的游戏 软件开发有30个员工 怎样用软件开发 怎样才能清理笔记本数据库
0