SparkSQL(2)——Spark SQL DataFrame概述

DataFrame是什么?

DataFrame的前身是SchemaRDD,从Spark 1.3.0开始SchemaRDD更名为DataFrame。
DataFrame与SchemaRDD的主要区别是:DataFrame不再直接继承自RDD,而是自己实现了RDD的绝大多数功能。但仍旧可以在DataFrame上调用rdd方法将其转换为一个RDD。

DataFrame是一种以RDD为基础的分布式数据集,类似于传统数据库的二维表格。
DataFrame带有Schema元信息,即DataFrame所表示的二维表数据集的每一列都带有名称和类型,但底层做了更多的优化。
DataFrame可以从很多数据源构建,比如:已经存在的RDD、结构化文件、外部数据库、Hive表。

DataFrame与RDD的区别

RDD可看作是分布式的对象的集合,Spark并不知道对象的详细模式信息;
DataFrame可看作是分布式的Row对象的集合,其提供了由列组成的详细模式信息,使得Spark SQL可以进行某些形式的执行优化。
DataFrame和普通的RDD的逻辑框架区别如下所示:
SparkSQL(2)——Spark SQL DataFrame概述

左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解 Person类的内部结构。
而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么,DataFrame多了数据的结构信息,即schema。这样看起来就像一张表了,DataFrame还配套了新的操作数据的方法,DataFrame API(如df.select())和SQL(select id, name from xx_table where …)。
总结:RDD中每以行数据是一个java对象,DataFrame中每一行数据是一个Row对象,DataFrame比rdd多了对数据的描述信息,这个信息就是schema元信息。

DataFrame与RDD的优缺点比较

RDD的优缺点:

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

DataFrame的优缺点:

dataFrame引入了schema和off-heap(不使用堆中的内存,直接使用操作系统层面的上的内存)
优点:
(1)序列化和反序列化数据传输量大大减少
由于引入了schema,后期再进行数据网络传入的时候就只需要把数据本身进行序列化和反序列化即可,针对于数据的结构这一块就可以省略。
(2)程序中就不会出现大量的GC
由于引入了off-heap,这个时候程序中大量对象的创建就不在jvm堆中,直接使用操作系统层面上的内存,这个时候就避免频繁的GC,提升了性能
缺点:
dataFrame由于引入了schema和off-heap,分别解决了RDD的缺点,但是同时也丢失了RDD的优点
(1)编译时类型不安全
(2)不具有面向对象编程的风格