Spark SQL中的Catalyst 的工作机制
答:不管是SQL、Hive SQL还是DataFrame、Dataset触发Action Job的时候,都会经过解析变成unresolved的逻辑执行计划,然后利用元数据信息对unresolved的逻辑执行计算进行分析,得到逻辑执行计划,然后对逻辑执行计划进行优化,得到优化后的逻辑执行计划,然后利用优化后的逻辑执行计划生成多个物理执行计划,利用cost model分别对所有的物理执行计划进行测试看看哪个性能更好,然后选出性能最好的物理执行计划,根据选择好的物理执行计划进行代码生成,最终生成RDD链,开始执行并返回结果

RDD是:不变的、分布式的数据集、在集群中是分区的、懒计算的以及是类型安全的
RDD是Spark的基础,Dataset和DataFrame最终还是会调用RDD的API来实现
DataFrame就是Row类型的Dataset,和RDD一样是不变的、分布式的数据集、在集群中是分区的、懒计算的,但不是类型安全的,没有提供类似于RDD中的函数式编程的接口,但是DataFrame的性能比RDD强很多
Dataset就是强类型、支持函数式变成的DataFrame,说白了Dataset就是RDD + DataFrame
 
这个是因为Spark团队利用DataFrame或者Dataset中的Schema信息对DataFrame或者Dataset中的API做了很大的性能优化,如下:
1、在缓存DataFrame或者Dataset的时候,可以对基本类型的列按列进行存储
2、钨丝计划:第一、引入了一个显示的内存管理器让Spark操作可以直接针对二进制数据而不是Java对象,这样就可以减少Java对象的开销和无效率的GC;第二、设计了更加缓存友好的算法和数据结构,从而让Spark应用程序可以花费更少的时间等待CPU从内存中读取数据,也给有用的工作提供了更多的计算时间;第三、Code generation去掉了原始数据类型的封装和解封,更重要的是避免了昂贵的多态函数调度
3、Catalyst Optimizer,因为Spark的RDD是懒加载的,所在在触发Job之前可以对RDD的链做很多的优化,而Catalyst Optimizer就是给这个RDD链方便的加上优化的手段
 
 

Spark SQL中的Catalyst 的工作机制的更多相关文章

  1. Spark SQL中UDF和UDAF

    转载自:https://blog.csdn.net/u012297062/article/details/52227909 UDF: User Defined Function,用户自定义的函数,函数 ...

  2. Spark SQL中Not in Subquery为何低效以及如何规避

    首先看个Not in Subquery的SQL: // test_partition1 和 test_partition2为Hive外部分区表 select * from test_partition ...

  3. Spark SQL中列转行(UNPIVOT)的两种方法

    行列之间的互相转换是ETL中的常见需求,在Spark SQL中,行转列有内建的PIVOT函数可用,没什么特别之处.而列转行要稍微麻烦点.本文整理了2种可行的列转行方法,供参考. 本文链接:https: ...

  4. spark sql中进行sechema合并

    spark sql中支持sechema合并的操作. 直接上官方的代码吧. val sqlContext = new org.apache.spark.sql.SQLContext(sc) // sql ...

  5. [翻译] Python 3.5中async/await的工作机制

    Python 3.5中async/await的工作机制 多处翻译出于自己理解,如有疑惑请参考原文 原文链接 身为Python核心开发组的成员,我对于这门语言的各种细节充满好奇.尽管我很清楚自己不可能对 ...

  6. Spark SQL中出现 CROSS JOIN 问题解决

    Spark SQL中出现 CROSS JOIN 问题解决 1.问题显示如下所示:     Use the CROSS JOIN syntax to allow cartesian products b ...

  7. Spark sql -- Spark sql中的窗口函数和对应的api

    一.窗口函数种类 ranking 排名类 analytic 分析类 aggregate 聚合类 Function Type SQL DataFrame API Description  Ranking ...

  8. 【原创】大叔经验分享(84)spark sql中设置hive.exec.max.dynamic.partitions无效

    spark 2.4 spark sql中执行 set hive.exec.max.dynamic.partitions=10000; 后再执行sql依然会报错: org.apache.hadoop.h ...

  9. Spark SQL中 RDD 转换到 DataFrame

    1.people.txtsoyo8, 35小周, 30小华, 19soyo,882./** * Created by soyo on 17-10-10. * 利用反射机制推断RDD模式 */impor ...

随机推荐

  1. 【bat】判断字符串是否包含某字符串

    @echo off set a=55544333 set c=6666dfsfds set b=44 echo %a%| findstr %b% >nul && ( echo % ...

  2. Linux常用基础(二)

    1.压缩包管理 (1)gz和bz2格式 1)gzip -- gz格式的压缩包 压缩:gzip +压缩的文件 解压缩:gunzip + 需要解压的文件 2)bzip2 -- bz2格式的压缩包 压缩:b ...

  3. SQLServer ---------- 附加数据库,以及解决附加时出现错误

    附加数据库的目的,进行数据库的转移,将需要的数据库,进行转移,软件在部署的时候,会经常使用 附加识别的数据库文件后缀是:  .mdf 方法: 1.首先把准备好的数据库文件,放到需要还原数据库的的电脑上 ...

  4. [转帖]Mysql各版本介绍及下载

    Mysql各版本介绍及下载 http://blog.itpub.net/12679300/viewspace-1251661/ 原创 MySQL 作者:wzq609 时间:2014-08-15 10: ...

  5. Docker 搭建简单 LVS

    LVS简介 LVS(Linux Virtual Server)即Linux虚拟服务器,是由章文嵩博士主导的开源负载均衡项目,目前LVS已经被集成到Linux内核模块中.该项目在Linux内核中实现了基 ...

  6. golang 学习笔记 -- 类型

    int 和 uint的实际宽度会根据计算架构不同而不同,386下4个字节, amd64下8个字节 byte可看做uint8的别名类型 rune可看做int32的别名类型,专用于存储Unicode编码的 ...

  7. NETCore使用带有权限验证的Swagger

    原文:NETCore使用带有权限验证的Swagger 文章目录 Swagger 什么是Swagger NuGet安装 Startup注册Swagger 设置默认首页打开Swagger 为接口添加注释 ...

  8. javascript query string

    function getQueryVariable(variable) { var query = window.location.search.substring(1); var vars = qu ...

  9. 解决IE下打印iframe时,页面比例变小的问题

    $('#reportFrame')[0].contentWindow.printMyself();//主页面调用iframe里的打印方法 //reportFrame里的方法 function prin ...

  10. 用C#搭建WebSocket

    WebSocket 是 HTML5 开始提供的一种在单个 TCP 连接上进行全双工通讯的协议. WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据.在 W ...