----原语句(运行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相关推荐

  1. MySQL大表关联如何优化_MySQL 对于大表(千万级),要怎么优化呢?

    http://www.zhihu.com/question/19719997 提问:如何设计或优化千万级别的大表?此外无其他信息,个人觉得这个话题有点范,就只好简单说下该如何做,对于一个存储设计,必须 ...

  2. 14 ,spark sql 例子 :四张表数据( student,course,score,teacher ),建表

    1 ,数据准备 : 4 张表 学生表 ( student ) : ( sid , sname , ssex , sbirth , sclazz ) 学号 ,姓名 ,性别 ,生日 ,班级 1 孙福龙 m ...

  3. spark sql合并小文件_如何比较Hive,Spark,Impala和Presto?

    Spark,Hive,Impala和Presto是基于SQL的引擎,Impala由Cloudera开发和交付.在选择这些数据库来管理数据库时,许多Hadoop用户会感到困惑.Presto是一个开放源代 ...

  4. spark sql合并小文件_Spark SQL小文件问题在OPPO的解决方案

    Spark SQL小文件是指文件大小显著小于hdfs block块大小的的文件.过于繁多的小文件会给HDFS带来很严重的性能瓶颈,对任务的稳定和集群的维护会带来极大的挑战. 一般来说,通过Hive调度 ...

  5. 时间段优化oracle,九大Oracle性能优化基本方法详解

    51CTO数据库频道向您推荐<Oracle数据库调试与性能优化>专题,以便于您更好的理解本文. Oracle性能优化基本方法包括一下几个步骤,包括: 1)设立合理的Oracle性能优化目标 ...

  6. MySQL同表关联的id替换名称_MySQL JOIN用另一个表中的值替换ID

    假设我有一个包含各种类型的编码表,例如: ID EncodingName ------------------ 1 UTF-8 2 ISO-8859-1 另一个EncodingMapping使用这些I ...

  7. java 性能 优化_Java十大简单性能优化

    java 性能 优化 关于" web scale "这个流行词有很多炒作,人们花了很多时间来重新组织他们的应用程序体系结构,以使其系统"规模化". 但是什么是扩 ...

  8. Matlab群体智能优化算法之大鲹鱼优化算法(GTO)

    Giant Trevally Optimizer : A Novel Metaheuristic Algorithm for Global Optimization and Challenging 一 ...

  9. 【hive】数据倾斜-大表小表join优化mapjoin

    真正让你明白Hive调优系列3:笛卡尔乘积,小表join大表,Mapjoin等问题 0.Hive中的优化分类    真正想要掌握Hive的优化,要熟悉相关的MapReduce,Yarn,hdfs底层源 ...

最新文章

  1. Lintcode108 Palindrome Partitioning || solution 题解
  2. Java医疗管理系统技术描述
  3. 如何让PHP以root权限执行系统命令
  4. 【hdu4281状态压缩+01背包+多旅行商问题】
  5. C语言二分查找法(指针和数组实现)
  6. 高斯核函数参数确定_高斯过程
  7. 彻底卸载MYSQL,windows版
  8. 设计模式(Design pattern—
  9. Cisco Nexus-1000v授权
  10. 哈佛大学凌晨4点半的景象
  11. rostcm6情感分析案例分析_ROSTCM6 情感分析软件 这款软件能分析文章中所表达的情绪内容 从而帮助使用者得出文章的情绪 - 下载 - 搜珍网...
  12. ISO常见的17大体系介绍
  13. 鱼和熊掌可兼得?一文看懂又拍云 SCDN
  14. 【Multisim仿真】NE555组成的振荡器电路(占空比可调)
  15. reached getOption(“max.print”)
  16. 创建Docker镜像
  17. pads2007版本pcb导出的dxf在cad中打不开,提示“DXF 输入无效或不完整 -- 图形被放弃”
  18. 面试第一问:简单做个自我介绍吧,怎么回答才让面试官频频点头?
  19. 小伙利用Python绘制999种玫瑰花表白女神,会编程男孩子真好
  20. IBM ServerGuide 9.40

热门文章

  1. 【软件设计师】历年真题-模糊知识点备忘——15年上 上午真题
  2. C# WinForm 工作流设计 工作流程图拖拽设计 +GDI 绘制工作流程图
  3. python爬虫之Scrapy(一)
  4. 计算机英语 答案,计算机英语考试试题以及答案
  5. SPSS统计作图教程:百分条图/堆积条图
  6. 高数_证明_方向导数计算公式
  7. 自媒体账号ID应该怎么取?
  8. 比赛经验总结--187
  9. matlab 图片选取区域,利用MATLAB截取一张复杂图片中想要的区域
  10. 使用pgAdmin4备份恢复(爬坑)