本文来自 B站 黑马程序员 - Spark教程 :原地址
Spark Sql is Spark’s module for working with strutured data.
Spark Sql是Spark的模块
,用于处理
海量
结构化数据
限量:结构化数据处理
SparkSql 是非常成熟的 海量结构化数据处理框架
学习SparkSQL主要在2个点:
在许多年前(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
1、Hive和Spark 均是:“分布式Sql计算引擎”
2、均是构建大规模结构化数据计算的绝佳利器,同时SparkSql拥有更好的性能。
3、目前,企业中使用Hive仍旧居多,但SparkSql将会在很近的未来替代Hive成为分布式Sql计算市场的顶级
`Pandas - DataFrame
二维表数据结构
SparkCore - RDD
分布式集合(分区)
SparkSql - DataFrame
二维表数据结构
分布式集合(分区)
SparkSql 其实有3类数据抽象对象
DataFrame
对象:可用于Java、Scala、Python、R从SparkSQL的发展历史可以看到:
DataFrame和RDD共同点:弹性的,分布式的,数据集
DataFrame和RDD差异点:DataFrame限定为:二维表
结构化数据。而RDD可以存储的数据则没有任何限制,想处理什么就处理什么
二维表名就是关系名。表中的第一行通常称为属性名,表中的每一个元组和属性都是不可再分的,且元组的次序是无关紧要的。
常用的关系术语如下:
记录 二维表中每一行称为一个记录,或称为一个元组。
字段 二维表中每一列称为一个字段,或称为一个属性。
域 一组具有相同数据类型的值。例如:自然数就是一个域
在RDD对象,程序的执行入口对象是:SparkContext
在Spark 2.0后,推出了SparkSession对象,作为Spark编码的统一入口对象。
SparkSession对象可以:
所以,我们后续的代码,执行环境入口对象,统一变更为SparkSession对象
DataFrame是一个二维表结构,那么表格结构就有无法绕开的三个点【行,列,表结构描述】
在结构层面
在数据层面
DataFrame支持两种风格进行编程,分别是:
DSL风格
领域特定语言
,其实就是指DataFrame的特有API,DSL风格意思就是以调用APi的方式来处理Data
SQL风格
SQL风格就是使用SQL语句处理DataFrame的数据
无论Hive还是SparkSQL分析处理数据时,往往需要使用函数,SparkSql模块本身自带很多实现公共功能的函数,在pyspark.sql.function中。SparkSQL与Hive一样支持定义函数:UDF和UDAF,尤其是UDF函数在实际项目中使用最为广泛。
回顾Hive中自定义函数有三种类型:
第一种:UDF(user-defined-function)函数
第二种:UDAF(user-defined Aggregation function)聚合函数
第三种:UDTF(user-defined Table-Generating funcation)函数
定义方式有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的方法名
开窗函数
介绍
开窗函数的引入是为了既显示聚集前的数据,又显示聚集后的数据,即在每一行的最后一列添加聚合函数的结果。
开窗用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用group by子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。
聚合函数和开窗函数
聚合函数是将多行变成一行,count,avg…。
开窗函数是将一行变成多行
聚合函数如果要显示其他的列必须将列加入到group by中
开窗函数可以不使用group by,直接将所有信息显示出来
开窗函数分类
聚合开窗函数
聚合函数(列)OVER(选项),这里的选项可以是PARTITION By 子句,但不可以是 ORDER By 子句。
排序开窗函数
排序函数(列)Over(选项),这里的选项可以是Order BY 子句,也可以是Over(Partition by 子句 Order BY 子句),但不可以是Partition by 子句
分区类型Ntilt的窗口函数
代码 -> DAG调度器逻辑任务 -> Task调度器任务分配和管理监控 -> worker干活
Rdd的运行会完全按照开发者的代码执行,如果开发者水平有限,RDD的执行效率也会受到影响
而SparkSql会对写完的代码,执行“自动优化”,以提升代码运行效率,避免开发者水平影响到代码执行效率。
为什么SparkSql可以优化,而RDD不可以?
RDD:内含数据类型不限格式和结构
DataFrame:100% 是二维表结构,可以被针对
SparkSql的自动优化,依赖于:Catalyst优化器
谓词下推(Predicate Pushdown) \ 断言下推:将逻辑判断 提前到前面,以减少shuffle阶段的数据量。
列值裁剪(Column Pruning): 将加载的列进行裁剪,尽量减少被处理数据的宽度
大白话:
Spark On Hive就是因为Spark自身没有元数据管理功能,所以使用Hive的Metastore服务作为元数据管理服务。计算由Spark执行。
Spark中有一个服务叫做:ThriftServer服务,可以启动并监听在10000端口
这个服务对外提供功能,我们可以用数据库工具或者代码连接上来 直接写SQL即可操作spark
当使用ThriftServer后,相当于是一个持续性的Spark On Hive集成模式。它提供10000端口,持续对外提供服务,外部可以通过这个端口连接上来,写SQL,让Spark运行。
SQL 提交后,底层运行的就是Spark任务。
duce并提交到YARN执行
2. MetaStore 元数据管理中心
Spark On Hive就是因为Spark自身没有元数据管理功能,所以使用Hive的Metastore服务作为元数据管理服务。计算由Spark执行。
Spark中有一个服务叫做:ThriftServer服务,可以启动并监听在10000端口
这个服务对外提供功能,我们可以用数据库工具或者代码连接上来 直接写SQL即可操作spark
当使用ThriftServer后,相当于是一个持续性的Spark On Hive集成模式。它提供10000端口,持续对外提供服务,外部可以通过这个端口连接上来,写SQL,让Spark运行。
SQL 提交后,底层运行的就是Spark任务。
相当于构建了一个以MetaStore服务为元数据,Spark为执行引擎的数据库服务,像操作数据库那样方便的操作SparkSQL进行分布式的SQL计算。