文章目录
一、SprkSQL是什么
1. 声明式(SQL) 和 命令式
命令式:主要特征是通过某个算子,可以得到一个结果,通过结果再进行后续的计算
sc.testFile("...") .flatMap(_.split(" ")) .map((_,1)) 注重数据分析的过程 .reduceByKey((_+_)) .collect()
命令式的优点:
- 操作粒度更精细,能够控制数据的每一个处理环节
- 操作更明确,步骤更清晰,容易维护
- 支持非结构化数据的操作
SQL : 查询出结果
select name, age, 注重数据分析的结果 sex from student where age>10
SQL的优点:
- 表达内容十分清晰
2.命令式、SQL的区别
命令式主要适用于数据处理的过程和算法性的处理
SQL式主要适用于数据分析以及简单的语法表示结果查询
3.SparkSQL的诞生及其特点
发展史:
Hive
- 实现了SQL on Hadoop,使用MapReduce执行任务
- 简化了MapReduce任务
* Hive的查询效率比较低,原因是MAPReduce使用调度
Shark
- 改写了Hive的物理执行计划,使用Spark作业代替了MapReduce执行物理计划
- 使用列式内存存储
* shark重用了Hive的SQL解析,执行计划严重依赖于Hive,想要新增或优化不容易
* Hive使用MapReduce执行作业,所以Hive是进程级别的并行,而Spark是线程级别的并行,所以Hive中许多线程不安全的代码不适合Spark
SparkSQL
- 使用Hive解析SQL生成AST语法树,将其后的逻辑计划生成、优化、物理计划都自己完成,减轻了Hive依赖
- 实行计划和优化交给了‘Catalyst’优化器
- 内建了一套简单的SQL解释器,可以不使用HQL,还引入了DataFrame,可以完全不用依赖Hive的任何组件
- shark只能够查询文件,而SparkSQL可以将查询直接作用于RDD
* 只能支持SQL的使用功能,不能很好的兼容命令式、入口不够统一
Dataset
- 统一并且结合了SQL的访问和命令式API的使用,可以做到使用SQL查询功能并且筛选数据,然后使用命令式API进行探索式分析
......
4.SparkSQL的应用场景
数据类型:
- 结构化数据
- 半结构化数据(半结构化数据具有一定的结构性)
- 非结构化数据(非结构化数据库是指其字段长度可变,并且每个字段的记录又可以由可重复或不可重复的子字段构成的数据库,用它不仅可以处理结构化数据(如数字、符号等信息)而且更适合处理非结构化数据(全文文本、图象、声音、影视、超媒体等信息)。
4.1 SparkSQl处理什么类型数据?
Spark的RDD主要处理的是非结构化数据和半结构化数据
SparkSQL主要处理的是结构化数据
4.2 SparkSQL 相比于 RDD 的优势
- SparkSQL提供了更好的外部数据源读写支持
大部分外部数据源是有结构化的,需要在RDD之外有一个新的解决方案,来整合这些结构化数据
- SparkSQL提供了直接访问的能力
SparkSQL主要用于处理结构化数据,所以其API具有一些普通数据库的能力
- SparkSQL是基于RDD的,但是其速度较快
- SparkSQL在编写的时候可以更方便针对于结构化数据的API进行更好的操作
5、SparkSQL初体验
5.1 命令式API
SparkSQL案例:
5.2 SparkSession介绍
一、SparkSession作为RDD的创建者和入口,其主要作用有两点
- 创建RDD,主要是通过读取文件创建RDD
- 监控和调度任务,包含一系列的组件,例如DAGScheduler、TaskScheduler
二、为什么无法使用SparkContext作为SparkSQL的入口?
- SparkContext在读取文件的时候,是不包含Schema信息的,因为读取出来的是RDD
- SparkContext在整合数据源(Cassandra\Json\Parquet)的时候不灵活,而Dataset和DataFrame一开始设计目标就是支持更多的数据源
- SparkContext的调度方式是直接调度RDD,但是一般情况下针对结构化数据的访问,会先通过优化器优化
所以在开始的时候,SparkSQL创建了两个入口:SQLContext、HiveContext。之后为了解决入口不统一的问题,创建了一个新的入口节点 — SparkSession,作为整个Spark生态工具的统一入口节点,包括了SQLContext、HiveContext、SparkContext等组建的功能。
三、SparkSession应有的特性
- 能够整合SQLContext、HiveContext、SparkContext、StreamingContext等不同的入口节点
- 为了支持更多的数据源,应该完善读取和写入体系
- 同时对于原来的入口节点没有放弃,可以向下兼容
RDD案例:
返回顶部
5.3 DataFrame&DataSet
对于RDD来说,它只能够根据存储的Person类型对象,对整体进行操作,但是对于DataFrame&DataSet来说,它能够明确处理到数据的某一具体字段,从根本上来说是由于他们所处理的数据信息类型的不同所导致的。
5.4 声明式API
所谓的声明式API就是在spark中使用纯SQL语句进行数据处理。在上述案例中,将读取好的数据注册为临时表person,就像在数据库中创建了一张表一样,接着使用SQL语句进行查询。
5.5 命令式API与声明式API的对比
通过上图对于声明式与命令式API的对比可以发现,其实两者的区别不是很大。只是命令式API调用了很多内置的函数,类似于指令一样,每一次调用函数就相当于下了一条命令去执行。
总结: