Spark SQL

1.请写出创建Dataset的几种方式?

  1. 由DataFrame转化成为Dataset。
  2. 通过SparkSession.createDataset() 直接创建。
  3. 通过toDS方法隐式转换。
    图 RDD / DataFrame / DataSet 转换关系
技巧

考察Spark Dataset 的创建方法。基础问题,需要能够掌握相互之间的转换。

2.DataFrame 相对 rdd 有哪些不同?

RDD特点:
  • RDD是一个懒执行的不可变的可以支持Lambda表达式的并行数据集合。
  • RDD的最大好吃就是简单,API的人性化程度很高。
  • RDD的劣势是性能限制,它是一个JVM驻内存对象,这也就决定了存在GC的限制和数据增加时Java序列化成本的升高。
DataFrame 特点:

与RDD类似,DataFrame也是一个分布式数据容器。然而DataFrame更像传统数据库的二维表格,除了数据以外,还记录数据的结构信息,即schema。同时,与Hive类似,DataFrame也支持嵌套数据类型(struct,array 和 map)。从API易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的RDD API要更加友好,门槛更低。由于与R 和 Pandas 的DataFrame类似,Spark DataFrame很好地继承了传统单机数据分析的开发体验。

技巧

考察DataFrame 和 RDD的区别,需要能够回答出RDD和DataFrame的不同。

SparkSql如何处理结构化数据和非结构化数据?

结构化数据:Json转化为DataFrame,通过注册表操作sql的方式。
非结构化数据:通过反射推断方式,构建一个Scheme。

技巧

考察Spark SQL处理数据的方式。需要能够回答出结构化的直接通过注册表进行操作,非结构数据可以通过反射推断,构建Scheme。

4*rdd,dataframe,和dataset区别

其实dataset就是dataframe的升级版,相当于dataframe是dataset的子集,主要区别在于,在Spark2.0以后的dataset添加的编码器,在dataframe中他不是面向对象的编程思维,而在dataset中变成面向对象编程,同时dataset相当于dataframe和rdd的整合版,操作更加灵活。

1.RDD

优点:

  • 编译时类型安全。
  • 编译时就能检查出类型错误。
  • 面向对象的编程风格。
  • 直接通过类名点的方式来操作数据。
    缺点:
  • 序列化和反序列化的性能开销。
  • 无论是集群间的通信,还是IO操作都需要对对象的结构和数据进行序列化和反序列化。
  • GC的性能开销,频繁的创建和销毁对象,势必会增加GC。
2.DataFrame

DataFrame引入了schema和off-heap。
schema:RDD每一行的数据,结构都是一样的,这个结构就存储在schema中。Spark通过schema就能够读懂数据,因此在通信和IO时就只需要序列化和反序列化数据,而结构的部分就可以省略了。

3.DataSet

DataSet结合了RDD和DataFrame的优点,并带来的一个新的概念Encoder。
当序列化数据时,Encoder产生字节码与off-heap进行交互,能够达到按需访问数据的效果,而不是反序列化整个对象。

技巧

考察DataFrame和DataSet的区别。需要能够回答出他们之间的关系,优缺点。

5.Spark SQL的原理?

1.Spark SQL运行流程
  1. 对读入的SQL语句进行解析
  • 分辨出SQL语句中哪些是关键词(如:select,from,where),哪些是表达式,哪些是Projection,那些是Data Source等。
  • 判断SQL语句是否规范。
  1. 将SQL语句和数据库的数据字典进行绑定
  • 数据字典:列,表,视图等等。
  • 若相关的Projection,DataSource等都是存在的话,就表示该SQL语句可以执行的。
  1. 数据库选择最优的执行计划
  • 数据库会提供几个执行计划,这些计划都会运行统计数据。
  • 数据库会从上述各种执行计划中选择一个最优计划。
  1. 执行计划
  • 按照Operation(操作)~>DataSource(数据源)~>Result的次序来执行。
  • 在执行过程中有时候甚至不需要读取物理表就可以返回结果,比如重新运行刚运行过的SQL语句,可直接从数据库的缓冲池中返回结果。
2.Spark SQL原理

Catalyst是Spark SQL执行优化器的代号,所有Spark SQL语句最终都能通过它来解析,优化,最终生成可以执行的Java字节码。
Catalyst最主要的数据结构是树,所有SQL语句都会用树结构来存储,树中的每个节点有一个类(class),以及0或多个子节点。Scala中定义的新的节点类型都是TreeNode这个类的子类。
Catalyst另外一个重要的概念是规则。基本上所有优化都是基于规划的,可以用规划对树进行操作,树中的节点是只读的,所以树也是只读的。规则中定义的函数可能实现从一棵树转换成一颗新树。
整个Catalyst的执行过程可以分为以下4个阶段:

  1. 分析阶段,分析逻辑树,解决引用。
  2. 逻辑优化阶段。
  3. 物理计划阶段,Catalyst会生成多个计划,并基于成本进行对比。
  4. 代码生成阶段。
技巧

考察Spark SQL的原理,需要能够回答出:

  1. Spark SQl的执行优化器Catalyst;
  2. 执行过程的4个阶段。

6. *Spark SQL中缓存方式有哪几种?registerTempTable是action类型的么,发生不发生缓存?

Spark SQL中的缓存方式:

  • 方式1:可以通过SQLContext实例.cacheTable(“表明”)缓存一张临时表
  • 方式2:可以通过DataFrame实例.cache()缓存一张虚拟表
    registerTempTable不是action类型的算子,不发生缓存。
技巧

基础问题,能够回答出缓存方式即可。另外registerTempTable不发生缓存。

7. SparkSQL中join操作与left join操作的区别?

join和SQL中的inner join操作很相似,返回结果是前面一个集合和后面一个集合中匹配成功的,过滤掉关联不上的。
leftJoin类似于SQL中的左外关联left outer join,返回结果以第一个RDD为主,关联不上的记录为空。
部分场景下可以使用left semi join 替代 left join:
因为 left semi join 是 in(keySet) 的关系,遇到右表重复记录,左表会跳过,性能更高,而 left join 则会一直遍历。但是 left semi join 中最后 select 的结果中只许出现左表中的列名,因为右表只有 join key参与关联计算了。

技巧

基础问题,能够回答出 join 和left join的区别即可。