1.RDD DataFrame DataSet的区别

(1) 三者之间的关系

DataFrame是特殊的RDD(它相当于RDD+schema,即RDD+表信息),可以将他看成数据库中的一张数据表,但是只知道这个"表"中的各个字段,不知道各个字段的数据类型。
Dataset是DataFrame的父类,当Dataset中存储Row(Row是一个类型,跟Car、Person这些的类型一样,所有的表结构信息我都用Row来表示)时,两者等价(Dataset[Row]=DataFrame)。

(2) 各自优缺点

RDD

优点:
编译时类型安全:编译时就能检查出类型错误;
面向对象的编程风格:直接通过对象调用方法的形式来操作数据

缺点:
序列化和反序列化的性能开销大:无论是集群的通信,还是IO操作,都需要对对象的结构和数据进行序列化和反序列化。
GC(垃圾回收)的性能开销大:频繁的创建和销毁对象,增加了GC的负担。

 DataFrame

优点:DataFrame通过引入schema (即数据的结构信息)和off-heap(不在堆里面的内存,使用操作系统上的内存), Spark通过schame就能够读懂数据, 因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了;通过off-heap引入,可以快速的操作数据,避免大量的GC。

缺点:DataFrame不是类型安全的, API也不是面向对象风格的。

DataSet

Dataset兼容了RDD和DataFrame的优点,使用在以后的spark中,Dataset将会逐步代替RDD和DataFrame的使用。

2.Catalyst工作流程

任何一个优化器工作原理都大同小异:SQL语句首先通过Parser模块被解析为语法树,此棵树称为Unresolved Logical Plan;Unresolved Logical Plan通过Analyzer模块借助于数据元数据解析为Logical Plan;此时再通过各种基于规则的优化策略进行深入优化,得到Optimized Logical Plan;优化后的逻辑执行计划依然是逻辑的,并不能被Spark系统理解,此时需要将此逻辑执行计划转换为Physical Plan;为了更好的对整个过程进行理解,下文通过一个简单示例进行解释。

Spark Row如何修改字段值 spark row对象_Spark Row如何修改字段值

3.spark SQL运行流程

1)对读入的sql语句进行解析

  • 分辨出sql语句中有哪些是关键词(如:select,from,where),哪些是表达式,哪些是Projection,哪些是Data Source等
  • 判断sql语句是否规范

2)将sql语句和数据库的数据字典进行绑定

  • 数据字典:列,表,视图等
  • 若相关的Projection DataSource 等都是存在的话,就表示该sql语句是可以执行的

3)数据库选择最优执行计划

  • 数据库会提供几个执行计划,这些计划都会运行统计数据
  • 数据库会从上述各种执行计划中选择一个最优计划

4)执行计划

  • 按照Operation(操作)–>DataSource(数据源)–>Result的次序来执行
  • 在执行的过程中有时候甚至不需要读取物理表就可以返回结果,比如重新运行刚运行的sql语句,可直接从数据库的缓冲池中返回结果