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执行
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任务。

相当于构建了一个以MetaStore服务为元数据,Spark为执行引擎的数据库服务,像操作数据库那样方便的操作SparkSQL进行分布式的SQL计算。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/122865.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Tomcat的类加载器

详情可以参考:https://tomcat.apache.org/tomcat-10.1-doc/class-loader-howto.html 简要说明 Tomcat安装了多种类加载器,以便容器的不同部分、容器中的应用访问能够不同的类和资源。 在Java环境中,类加载器被组织为父-子树的形式。通常情况…

文件包含漏洞培训

CTF介绍 MISC(Miscellaneous)类型,即安全杂项,题目或涉及流量分析、电子取证、人肉搜索、数据分析等等。CRYPTO(Cryptography)类型,即密码学,题目考察各种加解密技术,包括古典加密技术、现代加密技术甚至出题者自创加密技术。PWN类型,PWN在黑客俚语中代表着攻破、取得权限…

技术分享 | app自动化测试(Android)-- 属性获取与断言

断言是 UI 自动化测试的三要素之一,是 UI 自动化不可或缺的部分。在使用定位器定位到元素后,通过脚本进行业务操作的交互,想要验证交互过程中的正确性就需要用到断言。 常规的UI自动化断言 分析正确的输出结果,常规的断言一般包…

Qt实现动态桌面小精灵(含源码)

目录 一、设计思路 二、部分源码演示 三、源码地址 🌈write in front🌈 🧸大家好,我是三雷科技.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由三雷科技原创 CSDN首发🐒 如需转载还请通知⚠️ 📝个人主页:三雷科技🧸—CSDN博客 🎁欢…

Leetcode刷题详解——字母大小写全排列

1. 题目链接:784. 字母大小写全排列 2. 题目描述: 给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。 返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。 示例 1: 输入&…

渲染管线详解

光栅化的渲染管线一般分为三大阶段:应用程序阶段->几何阶段->光栅化阶段 也可以四大阶段: 应用程序阶段->几何阶段->光栅化阶段->逐片元操作阶段 更详细的流程如下: Vertex Specification(顶点规范化&#xff09…

刚接触银行新业务测试的一些问题

在银行金融领域的测试工作,相信很多测试工程师都会遇到自己不熟悉的业务。然后开始看文档,问开发或者需求人员。搞懂了大概的流程,然后开始进行测试。 不过遇到复杂的业务情况时,真的很需要时间去梳理。而且测试环境的配置问题、不…

【自然语言处理】基于python的问答系统实现

一,文件准备 该问答系统是基于已知的问题和其一一对应的答案进行实现的。首先需要准备两个文本文件,分别命名为“question.txt”和“answer.txt”,分别是问题文件和答案文件,每一行是一个问题以及对应的答案。 问题文件: 中国的首…

在群晖NAS上使用AudioStation实现本地音频公网共享

文章目录 1. 本教程使用环境:2. 制作音频分享链接3. 制作永久固定音频分享链接: 之前文章我详细介绍了如何在公网环境下使用pc和移动端访问群晖Audio Station: 公网访问群晖audiostation听歌 - cpolar 极点云 群晖套件不仅能读写本地文件&a…

Spring Boot中配置多个数据源

配置数据源实际上就是配置多个数据库,在一个配置文件中配置多个数据库,这样做主要的好处有以下几点: 数据库隔离:通过配置多个数据源,可以将不同的业务数据存储在不同的数据库中,实现数据的隔离。这样可以…

安全易用的文件同步程序:Syncthing | 开源日报 No.70

syncthing/syncthing Stars: 55.0k License: MPL-2.0 Syncthing 是一个持续文件同步程序,它在两台或多台计算机之间同步文件。该项目的主要功能和核心优势包括: 安全防止数据丢失抵御攻击易于使用自动化操作,仅在必要时需要用户交互适合在各…

Pytest系列(16)- 分布式测试插件之pytest-xdist的详细使用

前言 平常我们功能测试用例非常多时,比如有1千条用例,假设每个用例执行需要1分钟,如果单个测试人员执行需要1000分钟才能跑完当项目非常紧急时,会需要协调多个测试资源来把任务分成两部分,于是执行时间缩短一半&#…

船舶数据采集与数据模块解决方案

标准化信息处理单元原理样机初步方案: 1)系统组成 标准化信息处理单元原理样机包含硬件部分和软件部分。 硬件部分包括集成电路板、电源模块、主控模块、采集模块、信息处理模块、通讯模块、I/O模块等。 软件部分包括协议统一标准化模块、设备互联互…

R语言将向量横向转换为单行数据框,随后整合数量不确定的数据框

vector1 c(1, “karthik”, “IT”) names(vector1) c(“id”, “name”, “branch”) df data.frame(as.list(vector1)) print(df) 先给向量的元素命名,然后转换为列表,最后转换为数据框。 我的需求大概是这个样子:数量不确定的仅有单行…

猫罐头怎么选?千万别错过这5款好吃放心的猫罐头推荐!

猫罐头不仅美味可口,而且营养丰富,是专为猫咪打造的美食。那么,猫罐头怎么选?作为一位经营宠物店7年的店长,我对猫猫的饮食都非常重视,也见证了很多猫咪品尝各种猫罐头的瞬间,现在我对各个品牌的…

信创加速,美创科技加入UOS主动安全防护计划(UAPP)

近日,统信UOS主动安全防护计划 (UAPP) 技术沙龙暨新老会员交流活动在北京召开。 美创科技作为信创产业的重要参与者受邀参加。在2023年度UAPP合作伙伴授牌发布仪式上,美创科技获得统信软件授牌,正式成为UAPP成员单位,将与统信软件…

共话医疗数据安全,美创科技@2023南湖HIT论坛,11月11日见

11月11日浙江嘉兴 2023南湖HIT论坛 如约而来 深入数据驱动运营管理、运营数据中心建设、数据治理和数据安全、数据资产“入表”等热点、前沿话题 医疗数据安全、数字化转型深耕者—— 美创科技再次深入参与 全新发布:医疗数据安全白皮书 深度探讨:数字…

详细创建Prism架构wpf项目

方案一&#xff1a; 1.创建一个普通wpf项目 2、安装NuGet包&#xff1a;Prism.DryIoc 3、App.xaml.cs中: 将原本的父类Application改为&#xff1a;PrismApplication&#xff0c;并且实现抽象类 CreateShell方法中写上&#xff1a;”return Container.Resolve<MainWindow>…

分享4个MSVCP100.dll丢失的解决方法

msvcp100.dll是一个重要的动态链接库文件&#xff0c;它是Microsoft Visual C 2010 Redistributable Package的一部分。这个文件的作用是提供在运行C程序时所需的函数和功能。如果计算机系统中msvcp100.dll丢失或者损坏&#xff0c;就会导致软件程序无法启动运行&#xff0c;会…

【STM32】HAL库UART含校验位的串口通信配置BUG避坑

【STM32】HAL库UART含校验位的串口通信配置BUG避坑 文章目录 UART协议校验位HAL库配置含校验位的串口配置BUG避坑附录&#xff1a;Cortex-M架构的SysTick系统定时器精准延时和MCU位带操作SysTick系统定时器精准延时延时函数阻塞延时非阻塞延时 位带操作位带代码位带宏定义总线函…
最新文章