查询优化是传统数据库中最为重要的一环,这项技术在传统数据库中已经很成熟。除了查询优化, Spark SQL 在存储上也进行了优化,从以下几点查看 Spark SQL 的一些优化策略。
  (1)内存列式存储与内存缓存表
       Spark SQL 可以通过 cacheTable 将数据存储转换为列式存储,同时将数据加载到内存进行缓存。 cacheTable 相当于在分布式集群的内存物化视图,将数据进行缓存,这样迭代的或者交互式的查询不用再从 HDFS 读数据,直接从内存读取数据大大减少了 I/O 开销。列式存储的优势在于 Spark SQL 只需要读出用户需要的列,而不需要像行存储那样需要每次将所有列读出,从而大大减少内存缓存数据
量,更高效地利用内存数据缓存,同时减少网络传输和 I/O 开销。数据按照列式存储,由于是数据类型相同的数据连续存储,能够利用序列化和压缩减少内存空间的占用。
  (2)列存储压缩
  为了减少内存和硬盘空间占用, Spark SQL 采用了一些压缩策略对内存列存储数据 进 行 压 缩。 Spark SQL 的 压 缩 方 式 要 比 Shark 丰 富 很 多, 例 如 它 支 持 PassThrough,RunLengthEncoding, DictionaryEncoding, BooleanBitSet, IntDelta, LongDelta 等多种压缩方式。这样能够大幅度减少内存空间占用和网络传输开销和 I/O 开销。
  (3)逻辑查询优化
  Spark SQL 在逻辑查询优化(如图 1 所示)上支持列剪枝、谓词下压、属性合并等逻辑查询优化方法。列剪枝为了减少读取不必要的属性列,减少数据传输和计算开销,在查询优化器进行转换的过程中会进行列剪枝的优化。
  

          图 1   逻辑查询优化

  下面介绍一个逻辑优化例子:
SELECT Class FROM (SELECT ID,Name,Class FROM STUDENT ) S WHERE S.ID=1
Catalyst 将原有查询通过谓词下压,将选择操作 ID=1 优先执行,这样过滤大部分数据,通过属性合并将最后的投影只做一次最终保留 Class 属性列。
    (4) Join 优化
  Spark SQL 深度借鉴传统数据库查询优化技术的精髓,同时也在分布式环境下进行特定的优化策略调整和创新。 Spark SQL 对 Join 进行了优化支持多种连接算法,现
在的连接算法已经比 Shark 丰富,而且很多原来 Shark 的元素也逐步迁移过来。例如:BroadcastHashJoin、 BroadcastNestedLoopJoin、 HashJoin、 LeftSemiJoin,等等。
     下面介绍一个其中的 BroadcastHashJoin 算法思想。BroadcastHashJoin 将小表转化为广播变量进行广播,这样避免 Shuff le 开销,最后在分区内做 Hash 连接。这里用的就是 Hive 中 Map Side Join 的思想。同时用了 DBMS中的 Hash 连接算法做连接。
  随着 Spark SQL 的发展,未来会有更多的查询优化策略加入进来。同时后续 SparkSQL 会 支 持 像 Shark Server 一 样 的 服 务 端、 JDBC 接 口, 兼 容 更 多 的 持 久 化 层 例 如NoSQL,传统的 DBMS 等。一个强有力的结构化大数据查询引擎正在崛起。

Spark SQL概念学习系列之Spark SQL 优化策略(五)的更多相关文章

  1. Spark SQL概念学习系列之Spark SQL 架构分析(四)

    Spark SQL 与传统 DBMS 的查询优化器 + 执行器的架构较为类似,只不过其执行器是在分布式环境中实现,并采用的 Spark 作为执行引擎. Spark SQL 的查询优化是Catalyst ...

  2. Spark SQL概念学习系列之Spark SQL概述

    很多人一个误区,Spark SQL重点不是在SQL啊,而是在结构化数据处理! Spark SQL结构化数据处理 概要: 01 Spark SQL概述 02 Spark SQL基本原理 03 Spark ...

  3. Spark SQL概念学习系列之分布式SQL引擎

    不多说,直接上干货! parkSQL作为分布式查询引擎:两种方式 除了在Spark程序里使用Spark SQL,我们也可以把Spark SQL当作一个分布式查询引擎来使用,有以下两种使用方式: 1.T ...

  4. Spark RDD概念学习系列之Spark Hash Shuffle内幕彻底解密(二十)

    本博文的主要内容: 1.Hash Shuffle彻底解密 2.Shuffle Pluggable解密 3.Sorted Shuffle解密 4.Shuffle性能优化 一:到底什么是Shuffle? ...

  5. Spark SQL概念学习系列之Spark SQL的简介(一)

    Spark SQL提供在大数据上的SQL查询功能,类似于Shark在整个生态系统的角色,它们可以统称为SQL on Spark. 之前,Shark的查询编译和优化器依赖于Hive,使得Shark不得不 ...

  6. Spark SQL概念学习系列之Spark SQL入门

    前言 第1章   为什么Spark SQL? 第2章  Spark SQL运行架构 第3章 Spark SQL组件之解析 第4章 深入了解Spark SQL运行计划 第5章  测试环境之搭建 第6章 ...

  7. Spark SQL概念学习系列之Spark SQL入门(八)

    前言 第1章   为什么Spark SQL? 第2章  Spark SQL运行架构 第3章 Spark SQL组件之解析 第4章 深入了解Spark SQL运行计划 第5章  测试环境之搭建 第6章 ...

  8. Spark SQL概念学习系列之Spark SQL基本原理

    Spark SQL基本原理 1.Spark SQL模块划分 2.Spark SQL架构--catalyst设计图 3.Spark SQL运行架构 4.Hive兼容性 1.Spark SQL模块划分 S ...

  9. Spark SQL概念学习系列之Spark生态之Spark SQL(七)

    具体,见

随机推荐

  1. SQL 分组排序分页(大神帮写的膜拜一下)

    查询全部: SELECT P3.ID, P3.Name, P3.AddTimeFROM (SELECT Name, MAX(AddTime) AS MaxAddTime FROM Product AS ...

  2. Support Library官方教程(3)android studio中导入支援包

    Support Library Setup How you setup the Android Support Libraries in your development project depend ...

  3. PHPnow 升级后 PHP不支持GD、MySQL

    来自http://tunps.com/php-unsupport-gd-and-mysql-after-upgrade-phpnow 最近磁盘格式化误操作后,最近两天都在忙于数据恢复,现在才恢复正常. ...

  4. jquery获取div距离顶部的距离

    获取元素到页面顶部距离的语句为: 1.jquery写法:$(“#divID”).offset().top //推荐 $("#vertical").position().top 2. ...

  5. vssettings 的备份和导入

    vssettings 的作用:   vssettings的导出(也就是相当于是保存):   现在我们试试导入:找一个别人导出的包,我们导入试试.

  6. VS2010安装中遇到的错误

    背景 用win7 64位系统安装VS2010遇到一个错误,网上查了各种资料也没有找到这种解决办法,后来自己找到了解决办法,分享一下,让他人少走一些弯路. 错误信息 安装过程中遇到如下错误: [08/2 ...

  7. LeetCode Contains Duplicate II (判断重复元素)

    题意:如果有两个相同的元素,它们之间的距离不超过k,那么返回true,否则false. 思路:用map记录每个出现过的最近的位置,扫一边序列即可.扫到一个元素就判断它在前面什么地方出现过.本题数据有点 ...

  8. WordPress数据库研究 (转)

    该系列文章将会详细介绍WordPress数据总体的设计思路.详细介绍WordPress10个数据表的设计.并对WordPress系统中涉及的用户信息.分类信息.链接信息.文章信息.文章评论信息.基本设 ...

  9. 一天一个Java基础——对象和类

    1.在Java中你所做的全部工作就是定义类,产生那些类的对象,以及发送消息给这些对象 2.可以在类中设置两种类型的元素:字段(也被称作数据成员)和方法(也被称作成员函数) 3.字段可以是任何类型的对象 ...

  10. CKEditor如何统计文字数量

    今天在修改v5后台的比赛系统时,发现文本框需要限制输入字数.我们这个系统用的是3.6.3版本的,前台代码是这样的 <script> //编辑器 CKEDITOR.replace('matc ...