DataFrame简介
DataFrame被称为SchemaRDD。DataFrame使Spark具备了处理大规模结构化数据的能力。在Spark中,DataFrame是一种以RDD为基础的分布式数据集,因此DataFrame可以完成RDD的绝大多数功能,在开发使用时,也可以调用方法将RDD和DataFrame进行相互转换。DataFrame的结构类似于传统数据库的二维表格,并且可以从很多数据源中创建,例如结构化文件、外部数据库、Hive表等数据源。下面,通过图1来了解DataFrame与RDD在结构上的区别。
图1 DataFrame与RDD区别
在图1中,左侧为RDD[Person]数据集,右侧是DataFrame数据集。DataFrame可以看作是分布式的Row对象的集合,在二维表数据集的每一列都带有名称和类型,这就是Schema元信息,这使得Spark框架可以获取更多的数据结构信息,从而对在DataFrame背后的数据源以及作用于DataFrame之上数据变换进行了针对性的优化,最终达到大幅提升计算效率;同时,DataFrame与Hive类似,支持嵌套数据类型(例如Struct、Array、Map)。
RDD是分布式的Java对象的集合,例如图4-3中的RDD[Person]数据集,虽然它以Person为类型参数,但是对象内部之间的结构相对于Spark框架本身是无法得知的,这样在转换数据形式时效率相对较低。
总的来说,DataFrame除了提供比RDD更丰富的算子以外,更重要的特点是提升Spark框架执行效率、减少数据读取时间以及优化执行计划。有了DataFrame这个更高层次的抽象后,处理数据就更加简单了,甚至可以直接用SQL来处理数据,这对于开发者来说,易用性有了很大的提升。不仅如此,通过DataFrame API或SQL处理数据,Spark 优化器(Catalyst)会自动优化,即使我们写的程序或SQL不高效,程序也可以高效的执行。