Spark SQL优化:NOT IN子查询优化解决

这篇具有很好参考价值的文章主要介绍了Spark SQL优化:NOT IN子查询优化解决。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

 相关文章:

  1. LEFT ANTI JOIN的使用

  2. Spark SQL优化:NOT IN子查询优化解决

  3. hivesql-dayofweek 函数

  4. percentile_approx 聚合函数


背景

有如下的数据查询场景。

SELECT  a
       ,b
       ,c
       ,d
       ,e
       ,f
FROM xxx.BBBB
WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}' 
AND predict_type  
not IN 
( 
   SELECT 
		distinct a 
   FROM 
   xxx.AAAAA
   WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}' 
)

分析

通过查看SQL语句的执行计划基本就可以判断性能瓶颈所在。

  1. | == Physical Plan ==

  2. BroadcastNestedLoopJoin BuildRight,

Spark SQL的优化器最终将SQL优化为了一个BroadcastNestedLoopJoin。

实际上就是在对JOIN两侧的数据做笛卡尔积运算。时间复杂度为O(),过滤前的结果集行数达到了万亿级别。

优化方法

尝试将NOT IN子查询改写成了LEFT JOIN形式

SELECT  a.*
FROM
(
	SELECT  a
	       ,b
	       ,c
	       ,d
	       ,e
	       ,f
	FROM xxx.BBBB
	WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}'
) a
LEFT JOIN
(
	SELECT  c
	FROM xxx.AAAA
	WHERE dt = '${zdt.addDay(0).format('yyyy-MM-dd')}' 
) b
ON a.c = b.c 
WHERE b.c is null

执行计划如下:

  1. Filter is null(#391L)

  2. +- SortMergeJoin

可以看到,JOIN方式变成了SortMergeJoin。

SortMergeJoin的原理是对JOIN两侧的数据排序后在做归并。

不妨假设:

排序的时间复杂度为O(nlogn)。
则SortMergeJoin整体的时间复杂度为O(n + nlogn),依然是百万级数据量的过滤计算。

在数据库查询优化中,"Broadcast Nested Loop Join" 和 "Sort Merge Join" 是两种不同的关联操作算法。

Broadcast Nested Loop Join:
在这种连接算法中,一张表被广播到其他所有的节点上,然后与每个节点上的本地数据进行嵌套循环连接。这通常适用于一个小表和一个大表的连接,其中小表的数据可以很容易地广播到所有节点上。

优势:
1. 适用于小表连接
: 当一个表很小而另一个表很大时,广播小表可以减少网络传输和数据传输开销。
2. 简单性: 实现相对简单,不需要进行大规模数据排序。
3. 内存友好: 不需要大量的内存,因为每次只处理小表的一行。

Sort Merge Join:
这是一种更加通用的连接算法,它不涉及表的广播,而是将连接的列进行排序,然后按照排序结果进行逐对比较,从而执行连接操作。

优势:
1. 适用于大表连接
:当两个表的大小都比较大时,Sort Merge Join 可以更好地处理连接操作,因为不需要将整个表广播到各个节点。
2. 高效的顺序访问:由于涉及数据的排序,Sort Merge Join 可以更好地利用磁盘预读,提高磁盘数据访问效率。
3. 稳定性:对于不同数据分布的情况,Sort Merge Join 的性能通常比 Broadcast Nested Loop Join 更稳定。

所以,Broadcast Nested Loop Join 适用于小表和大表之间的连接,而 Sort Merge Join 则更适合连接两个较大的表。但请注意,具体的性能取决于数据分布、硬件配置和数据库管理系统的优化能力。在实际情况中,优化器可能会根据统计信息和其他因素来选择最适合的连接算法。文章来源地址https://www.toymoban.com/news/detail-754801.html

到了这里,关于Spark SQL优化:NOT IN子查询优化解决的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 二层交换机和三层交换机区别

    二层交换机和三层交换机区别

            1、两层交换机:工作于OSI模型的第2层(数据链路层),故而称为二层交换机。         2、三层交换机:具有部分路由器功能的交换机,工作在OSI网络标准模型的第三层。         1、两层交换机:属数据链路层设备,可以 识别数据包中的MAC地址信息 ,根

    2024年02月16日
    浏览(8)
  • 手把手教你使用gdb调试器

    手把手教你使用gdb调试器

    所谓调试,指的是对编好的程序用各种手段进进行查错和排非错的过程。进行这种查错处理时,下面将讲解如何使用gdb进行程序的调试。  gdb 简介 gdb是一个功能强大的调试工具,可以用来调试C程序或C++程序。在使用这个工具进行程序调试时,主要涉及下面四个方面的操作。

    2024年02月16日
    浏览(9)
  • git如何撤销commit(未push)

    git如何撤销commit(未push)

    Undo Commit,Revert Commit,Drop Commit的区别 是否删除对代码的修改 是否删除Commit记录 是否会新增Commit记录 Undo Commit 不会 未Push会,已Push不会 不会 Revert Commit 会 不会 会 Drop Commit 会 未Push会,已Push不会 不会 某次在idea中执行commit后(未push), 发现提交代码错误了想撤回,此篇文章整

    2024年02月16日
    浏览(6)
  • Stable Diffusion如何生成高质量的图-prompt写法介绍

    Stable Diffusion如何生成高质量的图-prompt写法介绍

    Stable Diffusion是一个开源的图像生成AI系统,由Anthropic公司开发。它基于 Transformer模型架构,可以通过文字描述生成高质量的图像。 Stable Diffusion的主要特点包括: 强大的图像生成能力。它可以根据文本描述生成非常逼真的图像,包括人物、风景、动物等各种主题。 对文本的理解能

    2024年02月16日
    浏览(10)
  • mac“XXX 已损坏,无法打开。移到废纸篓/推出磁盘映像。”

    mac“XXX 已损坏,无法打开。移到废纸篓/推出磁盘映像。”

    如果mac电脑,已经打开「设置」中的「安全性」信任「 任何来源 」,依旧提示: “XXX 已损坏,无法打开。移到废纸篓/推出磁盘映像。” 解决办法如下:打开「终端」执行如下命令: ~ sudo spctl --master-disable 回车后,输入电脑密码即可。 ~ xattr -cr /Applications/Sketch.app 操作如下

    2024年02月11日
    浏览(6)
  • Wish平台多账号店铺防关联怎么做?如何避免违规封店?

    了解跨境电商的人想必没人不知道Wish。多个Wish账号打造多个店铺,为卖家带来更多的销售机会。然而,Wish对于多账号多店铺是非常严格的。如果你在Wish上拥有多个账号和店铺,而这些账号和店铺之间存在关联,那么你就会面临被封店的风险。一旦被封店,想要恢复账号和店

    2024年02月12日
    浏览(6)
  • Docker部署nacos 添加配置文件提示: 发布失败。请检查参数是否正确。

    Docker部署nacos 添加配置文件提示: 发布失败。请检查参数是否正确。

    网络上解法一 :mysql和nacos的版本不对应导致 网络上解法二 :配置表缺少encrypted_data_key字段 执行建表语句从别人的博客中复制的sql,这两个字段初始化就是不允许为null; encrypted_data_key修改微允许为null即可; 备注: 以上只是我配置nacos的时候遇到的问题以及解决办法,希望

    2024年02月12日
    浏览(5)
  • scrapy---爬虫中间件和下载中间件

            -进来request对象         -加代理         -加cookie         -加请求头     -出去response对象         -修改响应对象,最后进入到爬虫的parser中就是修改后的response 1.加代理   2.加cookie,修改请求头,随机生成UserAgent         2.1加cookie        2.2 修改请求头

    2024年02月16日
    浏览(19)
  • SQL Server复制删除发布时遇到错误18752

    朋友反馈他无法删除一台SQL Server数据库上的发布,具体情况为删除一个SQL Server Replication的发布时,遇到下面错误 好久没有维护SQL Server数据库了,感觉生疏了很多,检查后发现其实出现这个错误,是因为一次只能有一个日志读取器代理或日志相关过程(sp_repldone、sp_replcmds 和

    2024年01月25日
    浏览(9)
  • 【Python从入门到进阶】28、xpath的安装以及使用

    【Python从入门到进阶】28、xpath的安装以及使用

    接上篇《27、Handler处理器使用及代理和Cookie登录实现》 上一篇我们讲解了urllib中Handler处理器的基本使用,以及实现代理访问和Cookie的登录。本篇我们来讲解HTML文档解析中的核心插件xpath的安装及使用。 XPath是由W3C(World Wide Web Consortium)组织发布的。W3C是一个国际性组织,负

    2024年02月05日
    浏览(5)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包