大数据常见面试题之spark sql

一.创建DataSet的几种方式

  • 1.由DataFrame转化成DataSet
  • 2.通过SparkSession.createDataSet()直接创建
  • 3.通过toDS方法隐式转换

二.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很好地继承了传统单机数据分析的开发体验

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

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

四.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进行交互,能够达到按需访问数据的效果,而不用反序列化整个对象

五.spark sql运行流程

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

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

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

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

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

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

4)执行计划

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

六.spark sql原理

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

整个Catalyst的执行过程可分为以下4个阶段:

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

七.spark sql 中缓存方式

  • 1):通过SqlContext实例.cacheTable(“表名”)缓存一张临时表
  • 2):通过DataFrame实例.cache()缓存一张虚拟表
    注意:registerTempTable不是action类型的算子,不发生缓存

八.spark sql中join操作与left join操作区别

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

猜你喜欢

转载自blog.csdn.net/sun_0128/article/details/107858345