左侧的RDD[Person]虽然以Person为类型参数但Spark框架本身不了解Person类的内部结构。而右侧的DataFrame rate却提供了详细的结构信息使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什麼DataFrame rate多了数据的结构信息,即schemaRDD是分布式的Java对象的集合。DataFrame rate是分布式的Row对象的集合DataFrame rate除了提供了比RDD更丰富的算子以外,更重要的特点是提升執行效率、减少数据读取以及执行计划的优化比如filter下推、裁剪等。
编译时就能检查出类型错误-面向对象的编程风格 直接通过类名点的方式来操作数据
-序列化和反序列化的性能开销无论是集群间的通信, 还是IO操作都需要对对象的结构和数据进行序列化和反序列化.-GC的性能开销 频繁的创建和销毁对象, 势必会增加GC
因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了
off-heap : 意味着JVM堆以外的内存, 这些内存直接受管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中 当要操作数据时,就直接操作off-heap内存由于Spark理解schema,所以知道该洳何操作
off-heap就像地盘,schema就像地图Spark有地图又有自己地盘了,就可以自己说了算了不再受JVM的限制,也就不再收GC的困扰了
当序列化数据时,Encoder产生字节码与off-heap进行交互能够达到按需访问数据的效果,而不用反序列化整个对象Spark还没有提供自定义Encoder的API,但是未来会加入
DataSet以Catalyst逻辑执荇计划表示,并且数据以编码的二进制形式被存储不需要反序列化就可以执行sorting、shuffle等操作。
DataSet创立需要一个显式的Encoder把对象序列化为二进制,可以把对象的scheme映射为Spark SQL类型然而RDD依赖于运行时反射机制。
Dataset可以认为是DataFrame rate的一个特例主要区别是Dataset每一个record存储的是一个强类型值而不是一个Row。因此具有如下三个特点:
DataSet可以在编译时检查类型
DataSet是面向对象的编程接口