【Spark】 SparkSQL初识

SparkSQL是Apache Spark的一部分,它融合了SQL查询和命令式编程,提供了处理结构化数据的高效工具。SparkSQL通过Hive解析SQL并使用Catalyst优化器,支持DataFrame和Dataset,结合了SQL的易用性和RDD的强大功能。相较于RDD,SparkSQL在处理结构化数据时具有更好的性能和数据源支持。SparkSession作为统一入口,集成了SQLContext、HiveContext和SparkContext的功能,简化了开发。命令式API和声明式API各有优势,前者注重过程,后者注重结果,而Dataset则统一了这两种API的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



一、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调用了很多内置的函数,类似于指令一样,每一次调用函数就相当于下了一条命令去执行。


总结:
在这里插入图片描述

返回顶部


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛ひ追导弹'

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值