认识Spark SQL
1、什么是Spark SQL?
Spark SQL是Spark的核心组件之一,主要用于进行结构化数据的处理。它提供的最核心的编程抽象就是DataFrame。
2、Spark SQL的作用
提供一个编程抽象(DataFrame) 并且作为分布式 SQL 查询引擎
DataFrame:它可以根据很多源进行构建,包括:结构化的数据文件,hive中的表,外部的关系型数据库,以及RDD
3、运行原理
将 Spark SQL 转化为 RDD, 然后提交到集群执行
4、特点
(1)容易整合
(2)统一的数据访问方式
(3)兼容 Hive
(4)标准的数据连接
5、Spark SQL数据抽象
RDD (Spark1.0) -> DataFrame (Spark1.3) -> DataSet ( Spark1. 6)
- Spark SQL提供了DataFrame和DataSet的数据抽象。
- DataFrame就是RDD + Schema,可以认为是一张二维表格。 他的劣势是在编译器不进行表格中的字段的类型检查。在运行期进行检查。
- DataSet是 Spark最新的数据抽象, Spark的发 展会逐步将DataSet作为主要的数据抽象,弱化RDD和DataFrame。 DataSet包含了DataFr ame所有的优化机制。除此之外提供了以样例类为Schema模型的强类型。
- DataFrame = DataSet [Row]
- DataFrame和DataSet都有可控的内存管理机制,所有数据都保存在非堆上,都使用了catalyst进行SQL的优化。
Spark SQL API
1、SparkContext
2、SQLContext
Spark SQL的编程入口
3、HiveContext
SQLContext的子集,包含更多功能
4、SparkSession(Spark 2.x推荐)
SparkSession:合并了SQLContext与HiveContext
提供与Spark功能交互单一入口点,并允许使用DataFrame和Dataset API对Spark进行编程
注:
- 1、无特殊说明时,下文中“spark”均指SparkSession实例
- 2、如果是spark-shell下,会自动创建“sc”和“spark”
SparkSession 是 Spark 2.0引入的新概念。SparkSession为用户提供了统一的切入点,来让用户学习spark的各项功能。
在spark的早期版本中,SparkContext 是 spark的主要切入点,由于RDD是主要的API,我们通过sparkcontext来创建和操作RDD。对于每个其他的API,我们需要使用不同的context。例如,对于Streming,我们需要使用 StreamingContext ;对于sql,使用 sqlContext ;对于Hive,使用 hiveContext 。
但是随着DataSet 和 DataFrame的API逐渐成为标准的API,就需要为他们建立接入点。所以在spark2.0中,引入SparkSession作为DataSet和DataFrameAPI 的切入点,SparkSession封装了SparkConf、SparkContext和SQLContext。为了向后兼容,SQLContext和HiveContext也被保存下来。
SparkSession 实质上是 SQLContext 和 HiveContext 的组合(未来可能还会加上 StreamingContext),所以在 SQLContext 和 HiveContext 上可用的 API 在 SparkSession 上同样是可以使用的。SparkSession 内部封装了 SparkContext,所以计算实际上是由 SparkContext 完成的。
特点:
- 为用户提供一个统一的切入点使用Spark 各项功能
- 允许用户通过它调用 DataFrame 和 Dataset 相关 API 来编写程序
- 减少了用户需要了解的一些概念,可以很容易的与 Spark 进行交互
- 与 Spark 交互之时不需要显示的创建 SparkConf, SparkContext 以及 SQlContext,这些对象已经封闭在 SparkSession 中
5、Dateset
特定域对象中的强类型集合
5.1 创建Dateset
createDataset()的参数可以是:Seq、Array、RDD
spark.createDataset(1 to 3).show
spark.createDataset(List(("a",1),("b",2),("c",3))).show
spark.createDataset(sc.parallelize(List(("a",1,1),("b",2,2)))