开始前废话
因为以前只接触过RDD编程,对DataFrame与Dataset不怎么了解。仅知道Spark Sql是基于DataFrame与Dataset实现的。
之前在看Structured Streaming的时候,在Spark官方文档上看到,MLlib以前是基于RDD实现的,后续会逐渐替换成基于DataFrame实现,留下了DataFrame与Dataset性能要优于RDD的印象。
但是在看第三章的时候,SQL转换成物理算子后,会直接生成RDD,也就是sql 最终是基于RDD进行计算的?
Spark SQL转换成RDD的过程简述
Spark SQL首先解析成逻辑计划算子树 ,然后逻辑计划算子树转换成 物理计划算子树 ,然后遍历物理算子节点触发RDD运算。因为SQL转换成RDD的过程在Driver端进行,因此可通过断点的方式阅读源码。
了解转换细节前重要的概念
即使书中说了也还是想象不出三个玩意的在实际代码中的巧妙。下面是强扭的瓜,先撸过再说。。。
InternalRow及其子类:及其子类是用来表示转换成RDD后RDD中每行数据的数据类型也就是 RDD[InternalRow]
TreeNode及其子类:逻辑算子树以及物理算子树的节点类型
Expression及其子类:加减乘除??
数据类型
关系型数据库建表的时候通常要告诉数据库表有哪些列,每列的数据类型是什么。每个数据库都有自己的定义类型,建表的时候,列的类型只能从数据库定义的类型中选择。Spark SQL中也有定义好的数据类型。具体哪些类型可以看官方文档。 还有一个要点是所有的数据类型都是继承AbstractDataType实现的(后续思考题AbstractDataType的抽象思路)