1、DataFrame和RDD的区别
Spark SQL总结
1、左侧的RDD[Person]虽然以Person为类型参数,但Spark框架本身不了解 Person类的内部结构。
而右侧的DataFrame却提供了详细的结构信息,使得Spark SQL可以清楚地知道该数据集中包含哪些列,每列的名称和类型各是什么,DataFrame多了数据的结构信息,即schema。这样看起来就像一张表了。
2、DataFrame通过引入schema和off-heap(不在堆里面的内存,指的是除了不在堆的内存,使用操作系统上的内存),解决了RDD的缺点, Spark通过schame就能够读懂数据, 因此在通信和IO时就只需要序列化和反序列化数据, 而结构的部分就可以省略了;通过off-heap引入,可以快速的操作数据,避免大量的GC。但是却丢了RDD的优点,DataFrame不是类型安全的, API也不是面向对象风格的。

2、off-heap
DataFrame还引入了off-heap,意味着JVM堆以外的内存, 这些内存直接受操作系统管理(而不是JVM)。Spark能够以二进制的形式序列化数据(不包括结构)到off-heap中, 当要操作数据时, 就直接操作off-heap内存. 由于Spark理解schema, 所以知道该如何操作。

3、读取数据源创建DataFrame

val dataFrame=spark.read.text("/person.txt")
val jsonDF= spark.read.json("/people.json")
val parquetDF=spark.read.parquet("/users.parquet")

4、DataFrame两种风格语法常用操作
1、DSL(领域特定语言)风格操作

2、SQL风格操作
DataFrame的一个强大之处就是我们可以将它看作是一个关系型数据表,然后可以通过在程序中使用spark.sql() 来执行SQL语句查询,结果返回一个DataFrame:
spark.sql(“SQL语句”).show
如果想使用SQL风格的语法,需要将DataFrame注册成表:
personDF.registerTempTable(“t_person”)

5、DataSet和DataFrame的区别
1、DataSet包含了DataFrame的功能,Spark2.0中两者统一,DataFrame表示为DataSet[Row],即DataSet的子集。
2、相比DataFrame,Dataset提供了编译时类型检查,对于分布式程序来讲,提交一次作业太费劲了(要编译、打包、上传、运行),到提交到集群运行时才发现错误,这会浪费大量的时间,这也是引入Dataset的一个重要原因。
Spark SQL总结Spark SQL总结
6、DataFrame与DataSet互相转换
(1)DataFrame -> DataSet

val dataSet = dataFrame.as[Person]

(2)DataSet -> DataFrame

val dataFraem = dataSet.toDF()

相关文章: