Spark SQL

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变化不大。

总结

  1. SparkSql用于处理大规模结构化数据的计算引擎
  2. SparkSql在企业中广泛使用,并性能极好,学习它不管是工作还是就业都有很大帮助
  3. SparkSql:使用简单、APi统一、兼容Hive、支持标准化JDBC和ODBC连接
  4. 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对象

总结

  1. SparkSql 和 Hive同样,都是用于大规模SQL分布式计算的计算框架,均可以运行在YARN之上,在企业中广泛被应用
  2. SparkSQL的数据抽象为:SchemaRDD(废弃),DataFrame(Python,R,java,Scala),DataSet(java,Scala).
  3. DataFrame同样是分布式数据集,有分区可以并行计算,和RDD不同的是,DataFrame中存储的数据结构是以表格形式组织的,方便进行SQL计算
  4. DataFrame对比DataSet基本相同,不同的是DataSet支持泛型特性,可以让Java,Scala语言更好的利用到。
  5. 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的数据

总结

  1. DataFrame 在结构层面上由StructField组成列描述,由StructType构造表描述,在数据层面上,Column对象记录列数据,Row对象记录行数据
  2. DataFrame可以从RDD转换,Pandas DF转换,读取文件,读取JDBC等方法构建
  3. spark.read。format()和df.write.format()是DataFrame读取和写出统一化标准API
  4. SparkSQL默认在Shuffle阶段200个分区,可以修改参数获得最好性能
  5. dropDuplicates可以去重,dropna可以删除缺失值,fillna可以填充缺失值
  6. 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种

  1. 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风格

  2. 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使用窗口函数

开窗函数

  1. 介绍

    开窗函数的引入是为了既显示聚集前的数据,又显示聚集后的数据,即在每一行的最后一列添加聚合函数的结果。

    开窗用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用group by子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。

  2. 聚合函数和开窗函数

    聚合函数是将多行变成一行,count,avg...。

    开窗函数是将一行变成多行

    聚合函数如果要显示其他的列必须将列加入到group by中

    开窗函数可以不使用group by,直接将所有信息显示出来

  3. 开窗函数分类

    • 聚合开窗函数

      聚合函数(列)OVER(选项),这里的选项可以是PARTITION By 子句,但不可以是 ORDER By 子句。

    • 排序开窗函数

      排序函数(列)Over(选项),这里的选项可以是Order BY 子句,也可以是Over(Partition by 子句 Order BY 子句),但不可以是Partition by 子句

    • 分区类型Ntilt的窗口函数

总结

  1. SparkSQL支持UDF和UDAF定义,但在Python中,暂时只能定义UDF
  2. UDF定义支持2种方式,1 使用sparkSession对象构建,2 使用funcations包中提供的udf api构建。要注意 方式1可用Dsl和sql风格,方式2 仅可用于DSL风格
  3. 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的执行流程

  1. 提交SparkSQL代码
  2. catalyst优化
    • 生成原始AST语法数
    • 标记AST元数据
    • 进行断言下推和列值裁剪 以及其它方面的优化作用在AST上
    • 将最终AST得到,生成执行计划
    • 将执行计划翻译为RDD代码
  3. Driver执行环境入口构建(SparkSession)
  4. DAG调度器规划逻辑任务
  5. TASK调度区分配逻辑任务到具体Executor上工作并监控管理任务
  6. Worker干活

总结

  1. DataFrame因为存储的是二维表数据结构,可以被针对,所以可以自动优化执行流程
  2. 自动优化依赖Catalyst优化器
  3. 自动优化2个大的优化项是:1. 断言(谓词)下推(行过滤)2. 列值裁剪(列过滤)
  4. DataFrame代码在被优化有,最终还是被转换换成RDD去执行

第六章 Spark On Hive

  1. SQL优化翻译器(执行引擎),翻译SQL到MapReduce并提交到YARN执行
  2. 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执行

  1. 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计算。

相关推荐
DolphinScheduler社区32 分钟前
Apache DolphinScheduler + OceanBase,搭建分布式大数据调度平台的实践
大数据
时差9532 小时前
MapReduce 的 Shuffle 过程
大数据·mapreduce
kakwooi3 小时前
Hadoop---MapReduce(3)
大数据·hadoop·mapreduce
数新网络3 小时前
《深入浅出Apache Spark》系列②:Spark SQL原理精髓全解析
大数据·sql·spark
师太,答应老衲吧5 小时前
SQL实战训练之,力扣:2020. 无流量的帐户数(递归)
数据库·sql·leetcode
NiNg_1_2347 小时前
高级 SQL 技巧详解
sql
昨天今天明天好多天8 小时前
【数据仓库】
大数据
油头少年_w8 小时前
大数据导论及分布式存储HadoopHDFS入门
大数据·hadoop·hdfs
Elastic 中国社区官方博客9 小时前
释放专利力量:Patently 如何利用向量搜索和 NLP 简化协作
大数据·数据库·人工智能·elasticsearch·搜索引擎·自然语言处理
力姆泰克9 小时前
看电动缸是如何提高农机的自动化水平
大数据·运维·服务器·数据库·人工智能·自动化·1024程序员节