一、Spark SQL是什么?

1、Spark SQL是Spark套件中的一个模块,它将数据的计算任务通过SQL的形式转换成了RDD的计

算,类似于Hive通过SQL的形式将数据的计算任务转换成了MapReduce。

2、Spark SQL的特点:

(1) 和Spark Core的无缝集成,我可以在写整个RDD应用的时候,配置Spark SQL来实现我的逻辑

(2) 统一的数据访问方式,Spark SQL提供标准化的SQL查询。

(3) Hive的继承,Spark SQL通过内嵌Hive或者连接外部已经配置好的hive实例,实现了对Hive语法

的继承和操作。

(4) 标准化的连接方式,Spark SQL可以通过启动thrift Server来支持JDBC、ODBC的访问,将自己作

为一个BI Server使用。

Spark SQL 数据抽象

Spark 数据抽取 spark sql的数据抽象_Hive

从整个直观层面上看,RDD抽象实在Spark1.0时引入的,Dataframe抽象是在Spark1.3的时候引入

的,Dataset抽象是在Spark1.6的时候引入的。

Spark 数据抽取 spark sql的数据抽象_Hive_02

二、Dataframe是什么?

RDD + Schema 一张表

DataFrame也是懒执行的、不可变的,性能上比RDD要高

Dataframe的劣势在于在编译期缺少类型安全检查,运行期检查

三、Dataset是什么?

1、Dataframe API的一个扩展

2、Spark最新的数据抽象

3、具有类型安全检查

4、具有Dataframe的查询优化特性

5、Dataset支持编解码器

Spark 数据抽取 spark sql的数据抽象_SQL_03

6、样例类的使用

DataFrame=Dataset[Row]

7、DataSet是强类型的

DataFrame只是知道字段,但是不知道字段的类型,所以在执行这些操作的时候是没办法在编译的

时候检查是否类型失败的,比如你可以对一个String进行减法操作,在执行的时候才报错,而

DataSet不仅仅知道字段,而且知道字段类型,所以有更严格的错误检查。

四、RDD、DataFrame、DataSet有什么关系呢?

Spark 数据抽取 spark sql的数据抽象_数据抽象_04

总结:

Spark SQL

1、Spark SQL是Spark套件中的一个模块,它将数据的计算任务通过SQL的形式转换成了RDD的计

算,类似于Hive通过SQL的形式将数据的计算任务转换成了MapReduce。
2、Spark SQL的特点:

(1) 和Spark Core的无缝集成,我可以在写整个RDD应用的时候,配置Spark SQL来实现我的逻辑

(2) 统一的数据访问方式,Spark SQL提供标准化的SQL查询。

(3) Hive的继承,Spark SQL通过内嵌Hive或者连接外部已经配置好的hive实例,实现了对Hive语法

的继承和操作。

(4) 标准化的连接方式,Spark SQL可以通过启动thrift Server来支持JDBC、ODBC的访问,将自己作

为一个BI Server使用。

Spark SQL数据抽象

1、RDD(Spark1.0)->DataFrame(Saprk1.3)->DataSet(Spark1.6)

2、Spark SQL提供了DataFrame和DataSet的数据抽象。

3、DataFrame就是RDD + Schema,可以认为是一张二维表格。它的劣势是在编译期不进行表格中

的字段的类型检查,在运行期检查。

4、DataSet是Spark最新的数据抽象,Spark的发展会逐步将DataSet作为主要的数据抽象,强化RDD

和DataFrame。DataSet包含了DataFrame所有的优化机制。除此之外提供了以样例类为Schema模

型的强类型。

5、DataFrame = DataSet[Row]

6、DataFrame和DataSet都有可控的内存管理机制,所有数据都保存在非堆上,都使用了catalyst进

行SQL的优化。

三者的共性

1、RDD、DataFrame、Dataset全都是spark平台下的分布式弹性数据集,为处理超大型数据提供便

利。

2、三者都有惰性机制,在进行创建、转换,如map方法时,不会立即执行,只有在遇到Action 如

foreach时,三者才会开始遍历运算,极端情况下,如果代码里面有创建、转换,但是后面没有在

Action中使用对应的结果,在执行时会被直接跳过。

val sparkConf = new 

SparkConf().setMaster("local").setAppName("test").set("spark.port.maxRetries","1000")