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模板网!

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

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

相关文章

  • 云服务器SVN仓库搭建(以阿里云为例)

    远程连接阿里云服务器 安装svn(注意需要root权限使用命令sudo su) yum install subversion 安装成功后查看svn版本 svnserve --version  创建版本库的根目录 mkdir /var/svn 创建代码仓库 svnadmin create /var/svn/test    当前生成的目录结构 此处为svn的配置文件 创建用户名和密码 编辑passwd文件 创建

    2024年02月14日
    浏览(41)
  • 计算机网络——计算机网络体系结构

    1.1 概念 一般认为,计算机网络是一个将分散的,具有独立功能的计算机系统,通过通信设备与线路连接起来,由功能完善的软件实现资源共享的信息传递的系统,简而言之,计算机网络就是一些 互联的,自治的计算机系统的集合 1.2 组成 (1)从组成部分:由 硬件,软件,

    2024年02月15日
    浏览(52)
  • appium解决报错:ModuleNotFoundError: No modulenamed ‘selenium.webdriver.common.options‘

    出现这个错误是因为selenium与Appium-Python-Client版本不匹配。 appium: selenium: selenium要4.0版本以上 卸载selenium3.141: 如果安装selenium4.0 ** 会提示如果安装了,appium-python-client 2.7.1,那就要安装selenium~=4.1,这样依赖才匹配。selenium3.141和selenium4.0,4.1相差不是很大,但是selenium不同版本里

    2024年02月11日
    浏览(41)
  • SpringBoot+Prometheus+Grafana 监控面板(项目配置方式【入侵】)

    提示:本文使用SpringBoot 简单样例,介绍基础配置和使用方法 包含内容:Docker、SpringBoot、Maven、 Prometheus、Grafana等 提示:本文包含官网内容介绍,具体更项目的学习,请参照各官网文档,谢谢 官网:https://prometheus.io/ 文档地址:https://prometheus.io/docs/introduction/overview/ 使用领先

    2024年02月16日
    浏览(51)
  • 《动手学深度学习 Pytorch版》 10.6 自注意力和位置编码

    在注意力机制中,每个查询都会关注所有的键-值对并生成一个注意力输出。由于查询、键和值来自同一组输入,因此被称为 自注意力(self-attention),也被称为内部注意力(intra-attention)。本节将使用自注意力进行序列编码,以及使用序列的顺序作为补充信息。 给定一个由

    2024年02月06日
    浏览(44)
  • ubuntu22.04编译安装使用gstreamer指南

    ubuntu发行版22.04,该发行版内置Gstreamer1.20.1,gstreamer源码最新版本为1.20.3,差距不大 下载gstreamer源码 安装git 下载gstreamer 安装meson gstreamer1.60以后(不包含1.60),使用meson+ninja来构建 安装glib gstreamer是基于glib-gobject来实现的 安装libsoup 安装libunwind 安装libdw 安装g-ir-scanner 系统中

    2024年02月05日
    浏览(74)
  • 【Python 中的 plt.hist 函数详解】

    plt.hist 函数用于绘制直方图。直方图是一种用来表示数据分布的图形,它将数据分成若干个区间,然后统计每个区间中数据的数量,最终以柱状图的形式展示出来。 直方图主要用于可视化数据的分布情况。它将数据划分为一系列的区间(也称为箱子或柱子),然后计算每个区

    2024年04月13日
    浏览(44)
  • FDTD算法及其应用

    一、电磁场问题数值计算方法         有许多的数值计算方法用于解决电磁场问题。其中,一些最常用的方法包括:         1.有限元法(Finite Element Method,FEM):这种方法将连续的求解域离散化为有限个小的单元,对每个单元进行数值求解,然后将所有单元的解组

    2024年01月25日
    浏览(35)
  • idea2021配置Git&GitHub&账号登录授权

    下载地址:https://git-scm.com/downloads 安装很简单,这里不多废话。 点击 GitManage Remotes…点\\\"+\\\"号添加别名和仓库地址 转圈圈的同时会弹出浏览器,打开授权界面、 点击授权按钮后,输入账号密码登录,并再次点击授权按钮 最终出现下面提示,则over! over之后再去idea看,发现已

    2023年04月08日
    浏览(43)
  • 【0002】JDK1.7安装和环境变量配置(Windows7操作系统)

    链接:https://pan.baidu.com/s/1ZJTlD-bRw9VCNA5qY-ZU-A  提取码:3d4h 在Windows7操作系统下安装JDK1.7及配置环境变量。其它版本的JDK及操作系统安装步骤,基本上没有太大的差异,所以此文也可以指导安装其它系统中的不同版本的JDK。 先安装JDK再配置环境变量 JDK版本:JDK-7u80-windows-x64版本

    2024年03月25日
    浏览(52)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包