Spark SQL
本文来自 B站 黑马程序员 - Spark教程 :原地址
第一章 SparkSql快速入门
1.1 什么是SparkSql
Spark Sql is Spark's module for working with strutured data.
Spark Sql是Spark的模块
,用于处理
海量
结构化数据
限量:结构化数据处理
1.2 为什么学习SparkSql
SparkSql 是非常成熟的 海量结构化数据处理框架
学习SparkSQL主要在2个点:
- SparkSQL本身十分优秀,支持SQL语言\性能强\可以自动优化\API简单\兼容HIVE等等
- 企业大面积在使用SparkSQL处理业务数据
- 离线开发
- 数仓搭建
- 科学计算
- 数据分析
1.3 SparkSql的特点
1.4 SparkSql发展历史 - 前身Shark框架
在许多年前(2012\2013左右)Hive逐步火热起来,大片抢占分布式Sql计算市场
Spark作为通用计算框架,也不可能放弃这一细节领域
于是,Spark官方模仿Hive推出了Shark框架(Spark 0.9版本)
Shark框架是几乎100%模仿Hive,内部的配置项\优化项等都是直接模仿而来,不同的在于将执行引擎由MapReduce更换为Spark
因为Shark框架太模仿Hive,Hive是针对Mr优化,很多地方和SparkCore(RDD)水土不服,最终被放弃
Spark官方下决心开发一个自己的分布式SQL引擎 也就是诞生了现在的SparkSql
- 2014年 1.0正式发布
- 2015年 1.3发布DataFrame数据结构,没用至今
- 2016年 1.6发布Dataset数据结构(带泛型的DataFrame),适用于支持泛型的语言(java\Scala)
- 2016年 2.0统一了Dataset和DataFrame,以后只有Dataset了,Python用的DataFrame就是 没有泛型的Dataset
- 2019年 3.0发布,性能大幅度提升,SparkSQL变化不大。
总结
- SparkSql用于处理大规模结构化数据的计算引擎
- SparkSql在企业中广泛使用,并性能极好,学习它不管是工作还是就业都有很大帮助
- SparkSql:使用简单、APi统一、兼容Hive、支持标准化JDBC和ODBC连接
- SparkSql 2014年正式发布,当下使用最多的2.0版 Spark发布于2016年,当下使用的最新3.0版发布于2019年
第二章 SparkSql概述
2.1 SparkSql和Hive的异同
1、Hive和Spark 均是:"分布式Sql计算引擎"
2、均是构建大规模结构化数据计算的绝佳利器,同时SparkSql拥有更好的性能。
3、目前,企业中使用Hive仍旧居多,但SparkSql将会在很近的未来替代Hive成为分布式Sql计算市场的顶级
2.2 SparkSql 的数据抽象
`Pandas - DataFrame
二维表数据结构
- 单机(本地)集合
SparkCore - RDD
- 无标准数据结构,存储什么数据均可
分布式集合(分区)
SparkSql - DataFrame
二维表数据结构
分布式集合(分区)
SparkSql 其实有3类数据抽象对象
- SchemaRDD对象(已废弃)
- DataSet对象:可用于Java、Scala语言
DataFrame
对象:可用于Java、Scala、Python、R
2.3 SparkSql 数据抽象的发展
从SparkSQL的发展历史可以看到:
- 14年最早的数据抽象是:SchemaRDD(内部存储二维表数据结构的RDD),SchemaRDD就是魔改的RDD,将RDD支持的存储数据,限定为二维表数据结构用以支持SQL查询。由于是魔改RDD,只是一个过渡产品,现已废弃
- 15年发布DataFrame对象,基于Pandas的DataFrams(模仿)独立于Rdd进行实现,将数据以二维表结构进行存储并支持分布式运行
- 16年发布DataSet对象,在DataFrame之上添加了泛型的支持,用以更好的支持Java和Scala这两个支持泛型的编程语言
- 16年,Spark2.0版本,将DataFrame和DataSet进行合并。其底层均是DataSet对象,但在Python和R语言到用时,显示为DataFrame对象。和老的DataFrame对象没有区别
2.4 DataFrame概述
DataFrame和RDD共同点:弹性的,分布式的,数据集
DataFrame和RDD差异点:DataFrame限定为:二维表
结构化数据。而RDD可以存储的数据则没有任何限制,想处理什么就处理什么
二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。
常用的关系术语如下:
记录 二维表中每一行称为一个记录,或称为一个元组。
字段 二维表中每一列称为一个字段,或称为一个属性。
2.5 SparkSession对象
在RDD对象,程序的执行入口对象是:SparkContext
在Spark 2.0后,推出了SparkSession对象,作为Spark编码的统一入口对象。
SparkSession对象可以:
- 用于SparkSql编程作为入口对象
- 用于SparkCore编程,可以通过SparkSession对象中获取SparkContext
所以,我们后续的代码,执行环境入口对象,统一变更为SparkSession对象
总结
- SparkSql 和 Hive同样,都是用于大规模SQL分布式计算的计算框架,均可以运行在YARN之上,在企业中广泛被应用
- SparkSQL的数据抽象为:SchemaRDD(废弃),DataFrame(Python,R,java,Scala),DataSet(java,Scala).
- DataFrame同样是分布式数据集,有分区可以并行计算,和RDD不同的是,DataFrame中存储的数据结构是以表格形式组织的,方便进行SQL计算
- DataFrame对比DataSet基本相同,不同的是DataSet支持泛型特性,可以让Java,Scala语言更好的利用到。
- SparkSession是2.0后退出的新执行环境入口对象,可以用于RDD,SQL等编程
第三章 DataFrame入门
3.1 DataFrame的组成
DataFrame是一个二维表结构,那么表格结构就有无法绕开的三个点【行,列,表结构描述】
在结构层面
- StructType对象描述整个DataFrame的表结构
- StructField对象描述一个列的信息
在数据层面
- Row对象记录一行数据
- Column对象记录一列数据并包含列的信息
3.3 DataFrame的入门操作
DataFrame支持两种风格进行编程,分别是:
-
DSL风格
领域特定语言
,其实就是指DataFrame的特有API,DSL风格意思就是以调用APi的方式来处理Data -
SQL风格
SQL风格就是使用SQL语句处理DataFrame的数据
总结
- DataFrame 在结构层面上由StructField组成列描述,由StructType构造表描述,在数据层面上,Column对象记录列数据,Row对象记录行数据
- DataFrame可以从RDD转换,Pandas DF转换,读取文件,读取JDBC等方法构建
- spark.read。format()和df.write.format()是DataFrame读取和写出统一化标准API
- SparkSQL默认在Shuffle阶段200个分区,可以修改参数获得最好性能
- dropDuplicates可以去重,dropna可以删除缺失值,fillna可以填充缺失值
- SparkSql支持JDBC读写,可用标准API对数据库进行读写操作
第四章 SparkSql函数定义
4.1 SparkSql定义UDF函数
无论Hive还是SparkSQL分析处理数据时,往往需要使用函数,SparkSql模块本身自带很多实现公共功能的函数,在pyspark.sql.function中。SparkSQL与Hive一样支持定义函数:UDF和UDAF,尤其是UDF函数在实际项目中使用最为广泛。
回顾Hive中自定义函数有三种类型:
第一种:UDF(user-defined-function)函数
- 一对一的关系,输入一个值经过函数以后输出一个值;
- 在Hive中继承UDF类,方法名称为evaluate,返回值不能为void,其实就是实现一个方法
第二种:UDAF(user-defined Aggregation function)聚合函数
- 多对一的关系,输入多个值输出一个值,通常与groupBy联合使用
第三种:UDTF(user-defined Table-Generating funcation)函数
- 一对多的关系,输入一个值输出多个值(一行变为多行)
- 用户自定义生成函数,有点像flatMap
定义方式有2种
-
sparkSession.udf.register()
注册的UDF可以用于DSL和SQL
返回值用于DSL风格,伟参内给的名字用于SQL风格
语法:
udf对象 = SparkSession.udf.register(参数1,参数2,参数3)
参数1:udf名称,可用于SQL风格
参数2:被注册成udf的方法名
参数3:声明udf的返回值类型
udf对象:返回值对象,是一个udf对象,可用于DSL风格
-
pyspark.sql.functions.udf
仅能用于DSL风格
语法:
udf对象 = F.udf(参数1,参数2)
参数1:被注册成UDF的方法名
参数2:声明UDF的返回值类型
udf对象:返回值对象,是一个udf对象,可用于DSL风格
其中F是:
from pyspark.sql import functions as F
其中,被注册成udf的方法名是指具体的计算方法,如def add(x,y):x+y
add就是将要被注册成udf的方法名
4.2 SparkSQL使用窗口函数
开窗函数
-
介绍
开窗函数的引入是为了既显示聚集前的数据,又显示聚集后的数据,即在每一行的最后一列添加聚合函数的结果。
开窗用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用group by子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
-
聚合函数和开窗函数
聚合函数是将多行变成一行,count,avg...。
开窗函数是将一行变成多行
聚合函数如果要显示其他的列必须将列加入到group by中
开窗函数可以不使用group by,直接将所有信息显示出来
-
开窗函数分类
-
聚合开窗函数
聚合函数(列)OVER(选项),这里的选项可以是PARTITION By 子句,但不可以是 ORDER By 子句。
-
排序开窗函数
排序函数(列)Over(选项),这里的选项可以是Order BY 子句,也可以是Over(Partition by 子句 Order BY 子句),但不可以是Partition by 子句
-
分区类型Ntilt的窗口函数
-
总结
- SparkSQL支持UDF和UDAF定义,但在Python中,暂时只能定义UDF
- UDF定义支持2种方式,1 使用sparkSession对象构建,2 使用funcations包中提供的udf api构建。要注意 方式1可用Dsl和sql风格,方式2 仅可用于DSL风格
- sparksql支持窗口函数使用,常用SQL中的窗口函数均支持,如聚合窗口\排序窗口\NTILE分组窗口等。
第五章 SparkSql的运行流程
5.1 RDD的执行流程回顾
代码 -> DAG调度器逻辑任务 -> Task调度器任务分配和管理监控 -> worker干活
5.2 SparkSql的自动优化
Rdd的运行会完全按照开发者的代码执行,如果开发者水平有限,RDD的执行效率也会受到影响
而SparkSql会对写完的代码,执行"自动优化",以提升代码运行效率,避免开发者水平影响到代码执行效率。
为什么SparkSql可以优化,而RDD不可以?
RDD:内含数据类型不限格式和结构
DataFrame:100% 是二维表结构,可以被针对
SparkSql的自动优化,依赖于:Catalyst优化器
5.3 Catalyst优化器
谓词下推(Predicate Pushdown) \ 断言下推:将逻辑判断 提前到前面,以减少shuffle阶段的数据量。
列值裁剪(Column Pruning): 将加载的列进行裁剪,尽量减少被处理数据的宽度
大白话:
- 行过滤,提前执行where
- 列过滤,提前规划select的字段数量
5.4 SparkSQL的执行流程
- 提交SparkSQL代码
- catalyst优化
- 生成原始AST语法数
- 标记AST元数据
- 进行断言下推和列值裁剪 以及其它方面的优化作用在AST上
- 将最终AST得到,生成执行计划
- 将执行计划翻译为RDD代码
- Driver执行环境入口构建(SparkSession)
- DAG调度器规划逻辑任务
- TASK调度区分配逻辑任务到具体Executor上工作并监控管理任务
- Worker干活
总结
- DataFrame因为存储的是二维表数据结构,可以被针对,所以可以自动优化执行流程
- 自动优化依赖Catalyst优化器
- 自动优化2个大的优化项是:1. 断言(谓词)下推(行过滤)2. 列值裁剪(列过滤)
- DataFrame代码在被优化有,最终还是被转换换成RDD去执行
第六章 Spark On Hive
- SQL优化翻译器(执行引擎),翻译SQL到MapReduce并提交到YARN执行
- MetaStore 元数据管理中心
Spark On Hive就是因为Spark自身没有元数据管理功能,所以使用Hive的Metastore服务作为元数据管理服务。计算由Spark执行。
第七章 分布式SQL执行引擎
7.1 概念
Spark中有一个服务叫做:ThriftServer服务,可以启动并监听在10000端口
这个服务对外提供功能,我们可以用数据库工具或者代码连接上来 直接写SQL即可操作spark
当使用ThriftServer后,相当于是一个持续性的Spark On Hive集成模式。它提供10000端口,持续对外提供服务,外部可以通过这个端口连接上来,写SQL,让Spark运行。
SQL 提交后,底层运行的就是Spark任务。
duce并提交到YARN执行
- MetaStore 元数据管理中心
Spark On Hive就是因为Spark自身没有元数据管理功能,所以使用Hive的Metastore服务作为元数据管理服务。计算由Spark执行。
第七章 分布式SQL执行引擎
7.1 概念
Spark中有一个服务叫做:ThriftServer服务,可以启动并监听在10000端口
这个服务对外提供功能,我们可以用数据库工具或者代码连接上来 直接写SQL即可操作spark
当使用ThriftServer后,相当于是一个持续性的Spark On Hive集成模式。它提供10000端口,持续对外提供服务,外部可以通过这个端口连接上来,写SQL,让Spark运行。
SQL 提交后,底层运行的就是Spark任务。
相当于构建了一个以MetaStore服务为元数据,Spark为执行引擎的数据库服务,像操作数据库那样方便的操作SparkSQL进行分布式的SQL计算。