动态分区裁剪,其实就牵涉到谓词下推,希望在读本文之前,你已经掌握了什么叫做谓词下推执行。

SparkSql 中外连接查询中的谓词下推规则

动态分区裁剪比谓词下推更复杂点,因为他会整合维表的过滤条件,生成filterset,然后用于事实表的过滤,从而减少join。当然,假设数据源能直接下推执行就更好了,下推到数据源处,是需要有索引和预计算类似的内容。

1.静态数据集分区谓词下推执行

下面sql 是为例

SELECT * FROM Sales WHERE day_of_week = ‘Mon’

该语句执行有两种可能:

1) .全表扫描,然后过滤。

2) .先过滤再扫描。

假如表按照day_of_week字段分区,那sql应该是将filter下推,先过滤,然后在scan。

这就是传统数据库存在索引及预计算的时候所说的谓词下推执行。2.动态分区裁剪场景Spark 3.0的分区裁剪的场景主要是基于谓词下推执行filter(动态生成),然后应用于事实表和维表join的场景。如果存在分区表和维表上的filter,则通过添加dynamic-partition-pruning filter来实现对另一张表的动态分区修剪。有下面一个简单的sql,完成的功能是事实表(sales)和维表(Date)的join:

SELECT * FROM Sales JOIN Date WHERE Date.day_of_week = ‘Mon’;

假如不存在任何下推执行的优化,执行过程就应该如下图:

上图就是不存在任何谓词下推执行优化的计算过程,全量扫描事实表sales和维表date表,然后完成join,生成的表基础上进行filter操作,然后在scan计算,显然这样做很浪费性能。

假如维表支持下推执行,那么就可以先进行维表的filter操作,减少维表Date的数据量加载,然后在进行事实表sales的scan和维表date的scan,最后进行join操作。

想一想,由于where条件的filter是维表Date的,spark读取事实表的时候也是需要使用扫描的全表数据来实现join,这就大大增加了计算量。假如能进一步优化,通过维表date的filter,生成一个新的事实表的salesFilterSet,应用到事实表sales,那么就可以大大减少join计算性能消耗。也即是这个样子:

这个就叫做动态分区裁剪。下面的例子会更详细点:

表t1和t2进行join,为了减少参加join计算的数据量,就为t1表计算(上图右侧sql)生成了一个filter数据集,然后再扫描之后过滤。当然,这个就要权衡一下,filter数据集生成的子查询及保存的性能消耗,与对数据过滤对join的性能优化的对比了,这就要讲到spark sql的优化模型了。

spark sql 是如何实现sql优化操作的呢?一张图可以概括:

现在sql解析的过程中完成sql语法优化,然后再根据统计代价模型来进行动态执行优化。逻辑执行计划的优化都是静态的,物理计划的选择可以基于统计代价模型来计算动态选择。下图是一个基于分区ID的join实现。维表的数据是没有分区的,事实表的数据是分区的。假如没有动态分区裁剪,那么完成的执行过程就如图所示。事实表和维表都需要全表扫描,然后对维表执行filter操作,最后再进行join操作。

假如对维表的filter操作,进行一些计算然后可以生成事实表的filter set,那么就可以减少维表和事实表join的数据量了。就如前面的t1和t2的join例子一样。

当然,上面的例子要考虑计算和保存事实表的filter set集合的开销是否远小于其减少join数据量的增益,否则就得不偿失了。还有一种join大家都比较熟悉,那就是Broadcast Hash Join。

这种主要是重用广播的结果,来实现filter功能。这个的理解要基于BroadcastExchangeExec。后面出文章详细聊吧。

至于效果码,可以关注浪尖微信公众号:bigdatatip。然后输入 :dpp获取完整的ppt及测试数据。

select weui 动态加载数据_浪尖以案例聊聊spark3的动态分区裁剪相关推荐

  1. 爬虫案例之爬取国家药监局化妆品生产许可明细(爬取动态加载数据)

    一.实验目的 爬取国家药监局(化妆品生产许可信息管理系统服务平台 (nmpa.gov.cn))化妆品生产明细(具体到每家企业的具体信息),当我们进入该网站首页时,发现其结构为每页15条的json类型数 ...

  2. echarts java动态数据_[ASP.net教程]ECharts Java 动态加载数据,echartsjava

    [ASP.net教程]ECharts Java 动态加载数据,echartsjava 0 2015-12-18 00:00:05 1.前台jsp页面html PUBLIC "-//W3C// ...

  3. JQuery-weui city-picker动态加载数据

    JQuery-weui city-picker动态加载数据 JQuery-weui city-picker 加载三级菜单 页面代码: <html><head><meta ...

  4. 如何在 InfoPath 2003 表单中动态加载数据

    转自微软:http://support.microsoft.com/kb/896451/zh-cn 概要 简介 更多信息 创建新的虚拟目录 设计 Microsoft Office InfoPath 2 ...

  5. python爬取js加载的数据_JS动态加载数据不会爬?老司机教你两个方法爬取想要的数据...

    学习Python的人绝大部分都是在用Python做爬虫,毕竟对于爬虫而言Python是不二选. 但是一般简单的静态页面网站还是很好爬取的,对于很多动态加载的网站就不知道怎么办了,今天小编就给大家介绍两 ...

  6. selectpicker 动态加载数据

    在做二级下拉菜单动的时候,一般需要动态的给第二个下拉菜单赋值(有时候第一个下拉菜单也是动态加载数据),一般的下拉框的样式比较丑,当使用selectpicker进行下拉菜单美化时,有可能导致下拉菜单加载 ...

  7. jqweui的picker动态加载数据

    大家好,我是烤鸭: jqweui的picker动态加载数据 jqweui是jquery对weui的拓展开发,picker就是其中的一个拓展组件, 1.    先附上官网显示地址和代码: http:// ...

  8. android listview动态加载数据,ListView动态加载数据

    当listview需要加载的数据过多时,若一次性载入则速度会相当缓慢,影响用户体验,这时候就需要动态加载数据,即每次载入固定长度的数据,android market的listview就是采用这种方式, ...

  9. iscroll动态加载数据完美解决方案

    iscroll动态加载数据完美解决方案 参考文章: (1)iscroll动态加载数据完美解决方案 (2)https://www.cnblogs.com/ShoneH/p/5253758.html (3 ...

最新文章

  1. Linux下,终端录制-asciinema
  2. MySQL 中 6 个常见的日志问题
  3. 微信月活跃用户数6.97亿 全球十大消息应用第四
  4. linux 磁盘簇,linux系统exec簇工作原理
  5. 【王道计组笔记】总线(1):总线的概念和分类
  6. mysql定时任务多条sql_【SQL】使用Navicat创建MySQL定时任务重复执行某个sql语句
  7. 图片、图标、代码资源网站
  8. natapp做一个内网穿透
  9. VS软件设置中的宏定义
  10. arduinouno的地是相连的吗_德阳马自达3方向机,宝马X7电子方向机进水可以修吗
  11. 程序员转行做什么工作比较好?
  12. 利用PS抠出水印字并添加到图片
  13. 关于浏览器部分JS失效原因
  14. RecyclerView 条目很少时,onBindViewHolder没有被调用,导致item状态错乱
  15. 软考高级 真题 2012年上半年 信息系统项目管理师 论文
  16. 揭秘广告软文的五种写法
  17. Google Filament 源码学习(二):Material System (一)
  18. <虎年大吉>超酷烟花特效
  19. 2010年江蘇省第六次人口普查
  20. 第四次工业革命 (The Industrial Revolution):人工智能 (AI)

热门文章

  1. 应用服务器Glassfish任意文件读取漏洞
  2. 系统集成项目管理视频课程
  3. 教你如何申请CCNP的电子证书
  4. VideoLan 0.8.6b test 1
  5. 【DS】线段树HDU-1166
  6. django准备 —环境配置,及其虚拟环境安装、django安装、数据库安装、新建项目...
  7. 运行mvc项目报错 %@ Application Codebehind=Global.asax.cs Inherits=NHAPPAPI.MvcApplication Language=C...
  8. python计算蛋白质的质量
  9. 大数据量下高并发同步的讲解(不看,保证你后悔!)
  10. C#反射读取和设置类的属性