spark sql优化:小表大表关联优化 union替换or broadcast join
----原语句(运行18min)
SELECTbb.ipFROM(SELECTip ,sum(click) click_num,round(sum(click) / sum(imp), 4) user_click_rateFROMschema.srctable1WHEREdate = '20171020'AND ip IS NOT NULLAND imp > 0GROUP BY ip) bbLEFT OUTER JOIN(SELECTround(sum(click) / sum(imp), 4) avg_click_rateFROMschema.srctable1WHEREdate = '20171020') aaLEFT OUTER JOIN schema.dstable ccon cc.ip = bb.ipWHERE cc.ip is nullAND(bb.user_click_rate > aa.avg_click_rate * 3AND click_num > 500)OR(click_num > 1000)
分析:
1、aa表存放的就是一个指标数据,1条记录,列为小表
2、bb表存放的是按ip聚合的明细数据,记录很多,列为大表
3、cc表用来过滤ip,数量也很小,列为过滤表,作用很小。
查看执行计划,发现bb与aa进行left outer join时,引发了shuffle过程,造成大量的磁盘及网络IO,影响性能。
解决策略
优化方案1:调整大小表位置,将小表放在左边后,提升至29s (该方案一直不太明白为啥会提升,执行计划里显示的也就是大小表位置调换下而已,跟之前的没其他区别)
优化方案2: 将 or 改成 union,提升至35s(各种调整,一直怀疑跟or有关系,后面调整成union其他不变,果真效率不一样;但方案1只是调整了下大小表顺序,并未调整其他,其效率同样提升很大;不太明白sparksql内部到底走了什么优化机制,后面继续研究);
优化方案3: 采用cache+broadcast方式,提升至20s(该方案将小表缓存至内存,进行map侧关联)
方案具体实施
----方案2:or 改成 union(运行35s)
select aa.ipfrom (SELECT bb.ip ipFROM(SELECTip ,sum(click) click_num,round(sum(click) / sum(imp), 4)user_click_rateFROMschema.srctable1WHEREdate = '20171020'AND ip IS NOT NULLAND imp > 0GROUP BY ip) bbLEFT OUTER JOIN(SELECT round(sum(click) / sum(imp), 4) avg_click_rateFROM schema.srctable1WHERE date = '20171020') aaWHERE ( bb.user_click_rate > aa.avg_click_rate * 3AND click_num > 20 )union SELECTbb.ip ipFROM(SELECTip , sum(click) click_num,round(sum(click) / sum(imp), 4) user_click_rateFROM schema.srctable1WHEREdate = '20171020'AND ip IS NOT NULLAND imp > 0GROUP BY ip) bbLEFT OUTER JOIN(SELECTround(sum(click) / sum(imp), 4) avg_click_rateFROM schema.srctable1WHERE date = '20171020') aaWHERE click_num > 40) aaLEFT OUTER JOIN schema.dstable ccon aa.ip = cc.ipwhere cc.ip is null
-----cache+broadcast方式(20s)
原理:使用broadcast将会把小表分发到每台执行节点上,因此,关联操作都在本地完成,基本就取消了shuffle的过程,运行效率大幅度提高。
cache table ctaasSELECT round(sum(click) / sum(imp), 4) avg_click_rateFROM schema.srctable1WHERE date = '20171020';INSERT into TABLE schema.dstableSELECT bb.ipFROM (SELECTip ,sum(click) click_num,round(sum(click) / sum(imp), 4) user_click_rateFROM schema.srctable1WHEREdate = '20171020'AND ip IS NOT NULLAND imp > 0GROUP BY ip) bbLEFT OUTER JOIN cta aaLEFT OUTER JOIN schema.dstable ccon cc.ip = bb.ipWHERE cc.ip is nullAND (bb.user_click_rate > aa.avg_click_rate * 3AND click_num > 500)OR(click_num > 1000)
注意:
cache 表不一定会被广播到Executor,执行map side join,还受另外一个参数:spark.sql.autoBroadcastJoinThreshold影响,该参数判断是否将该表广播;
spark.sql.autoBroadcastJoinThreshold参数默认值是10M,所以只有cache的表小于10M的才被广播到Executor上去执行map side join。
http://www.taodudu.cc/news/show-4722596.html
相关文章:
- SparkSql MAPJOIN优化之小表left join大表
- Spark RDD JOIN 调优
- sparksql中大小表jion
- left join最多几张表_Spark中的join策略
- spark做两张大表的join操作,mapPartition和重分区算子的使用策略
- Spark中的Join操作及问题解决
- Spark 大表之间的join
- Spark广播变量之超大表left join小表时如何进行优化以及小表的正确位置
- Spark性能调优案例-多表join优化,减少shuffle
- Spark调优、DataFrame API使用、大表Join、动态分区
- Spark性能调优案例-优化spark估计表大小失败 和 小表关联 走 broadcast join
- spark大小表join操作
- hashmap是无序的但是实际输出有序?
- HashMap内部节点是有序的吗?
- 有序的HashMap:LinkedHashMap
- hashmap有序吗?
- HashMap的key为Integer时为什么有序
- HashMap无序?TreeMap有序?
- hashmap的无序和有序
- HashMap和有序LinkedHashMap实现对比
- hashmap中的key是有序的么_Java中的HashMap,为什么输出竟然是有序的
- hashmap中的key是有序的么_HashMap是无序的
- 有序的hashmap (linkedhashmap) 测试及原理
- hashmap中的key是有序的么_关于HashMap中KEY的有序排列的反思和总结(对应TreeMap)
- hashmap中的key是有序的么_hashmap 是无序的但是实际输出有序。
- Java之有序集合hashMap
- HashMap中的遍历有序性探究
- HashMap有序性与无序性阐述
- 41.Java HashMap有序集合
- HashMap的到底是有序还是无序
spark sql优化:小表大表关联优化 union替换or broadcast join相关推荐
- MySQL大表关联如何优化_MySQL 对于大表(千万级),要怎么优化呢?
http://www.zhihu.com/question/19719997 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须 ...
- 14 ,spark sql 例子 :四张表数据( student,course,score,teacher ),建表
1 ,数据准备 : 4 张表 学生表 ( student ) : ( sid , sname , ssex , sbirth , sclazz ) 学号 ,姓名 ,性别 ,生日 ,班级 1 孙福龙 m ...
- spark sql合并小文件_如何比较Hive,Spark,Impala和Presto?
Spark,Hive,Impala和Presto是基于SQL的引擎,Impala由Cloudera开发和交付.在选择这些数据库来管理数据库时,许多Hadoop用户会感到困惑.Presto是一个开放源代 ...
- spark sql合并小文件_Spark SQL小文件问题在OPPO的解决方案
Spark SQL小文件是指文件大小显著小于hdfs block块大小的的文件.过于繁多的小文件会给HDFS带来很严重的性能瓶颈,对任务的稳定和集群的维护会带来极大的挑战. 一般来说,通过Hive调度 ...
- 时间段优化oracle,九大Oracle性能优化基本方法详解
51CTO数据库频道向您推荐<Oracle数据库调试与性能优化>专题,以便于您更好的理解本文. Oracle性能优化基本方法包括一下几个步骤,包括: 1)设立合理的Oracle性能优化目标 ...
- MySQL同表关联的id替换名称_MySQL JOIN用另一个表中的值替换ID
假设我有一个包含各种类型的编码表,例如: ID EncodingName ------------------ 1 UTF-8 2 ISO-8859-1 另一个EncodingMapping使用这些I ...
- java 性能 优化_Java十大简单性能优化
java 性能 优化 关于" web scale "这个流行词有很多炒作,人们花了很多时间来重新组织他们的应用程序体系结构,以使其系统"规模化". 但是什么是扩 ...
- Matlab群体智能优化算法之大鲹鱼优化算法(GTO)
Giant Trevally Optimizer : A Novel Metaheuristic Algorithm for Global Optimization and Challenging 一 ...
- 【hive】数据倾斜-大表小表join优化mapjoin
真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题 0.Hive中的优化分类 真正想要掌握Hive的优化,要熟悉相关的MapReduce,Yarn,hdfs底层源 ...
最新文章
- Lintcode108 Palindrome Partitioning || solution 题解
- Java医疗管理系统技术描述
- 如何让PHP以root权限执行系统命令
- 【hdu4281状态压缩+01背包+多旅行商问题】
- C语言二分查找法(指针和数组实现)
- 高斯核函数参数确定_高斯过程
- 彻底卸载MYSQL,windows版
- 设计模式(Design pattern—
- Cisco Nexus-1000v授权
- 哈佛大学凌晨4点半的景象
- rostcm6情感分析案例分析_ROSTCM6 情感分析软件 这款软件能分析文章中所表达的情绪内容 从而帮助使用者得出文章的情绪 - 下载 - 搜珍网...
- ISO常见的17大体系介绍
- 鱼和熊掌可兼得?一文看懂又拍云 SCDN
- 【Multisim仿真】NE555组成的振荡器电路(占空比可调)
- reached getOption(“max.print”)
- 创建Docker镜像
- pads2007版本pcb导出的dxf在cad中打不开,提示“DXF 输入无效或不完整 -- 图形被放弃”
- 面试第一问:简单做个自我介绍吧,怎么回答才让面试官频频点头?
- 小伙利用Python绘制999种玫瑰花表白女神,会编程男孩子真好
- IBM ServerGuide 9.40