SparkSQL零基础入门(11):sparkSQL的概述与SparkSession/RDD/DataFream/DataSet的概述

Spark SQL是一个用于处理结构化数据的模块,提供DataFrame编程抽象,结合Catalyst优化器实现高效执行。SparkSession作为Spark 2.0的统一入口,简化了Spark功能的访问。RDD具有局限性,而DataFrame和Dataset提供了编译时类型检查和面向对象的API。DataFrame是带有元数据的分布式数据集,Dataset则扩展了DataFrame的功能。Spark SQL编程包括创建SparkSession,操作DataFrame/Dataset,支持SQL查询和多种数据源。

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

在这里插入图片描述


没有看前面的同学可以回顾一下:
10.Spark零基础入门第十课:spark数据倾斜后怎么办??
9.Spark性能优化-开发调优
8.SparkCore 调优之内存模型
8.SparkCore 调优之内存模型
7.SparkCore 核心知识复习与核心机制详解
6.Spark共享变量之累加器和广播变量的使用!!!
5.RDD常用算子用法训练(附习题答案)(aggregateByKey与combineByKey)!!!
4.Spark Rdd常用算子和RDD必备知识
3.spark core 核心知识
2.spark 之 wordcount入门
1.spark 入门讲解

1、Spark SQL 概述

1.1、什么是 Spark SQL

Spark SQL 是 Spark 用来处理结构化数据(结构化数据可以来自外部结构化数据源也可以通 过 RDD 获取)的一个模块,它提供了一个编程抽象叫做 DataFrame 并且作为分布式 SQL 查 询引擎的作用。
外部的结构化数据源包括 JSON、Parquet(默认)、RMDBS、Hive 等。当前 Spark SQL 使用 Catalyst 优化器来对 SQL 进行优化,从而得到更加高效的执行方案。并且可以将结果存储到外部系 统。

1.2、为什么要学习 Spark SQL

我们已经学习了 Hive,它是将 Hive SQL 转换成 MapReduce 然后提交到集群上执行,大大简 化了编写 MapReduce 的程序的复杂性,由于 MapReduce 这种计算模型执行效率比较慢。所 以 Spark SQL 就应运而生,它的工作机制是将 Spark SQL 的 SQL 查询转换成 Spark Core 的应 用程序,然后提交到集群执行,执行效率非常快!

sha
Spark SQL 的特点:
1.容易整合
2.统一的数据访问方式
3.兼容Hive
4.标准的数据连接

2、SparkSession

SparkSession 是 Spark-2.0 引如的新概念。SparkSession 为用户提供了统一的切入点,来让用 户学习 Spark 的各项功能。

在 Spark 的早期版本中,SparkContext 是 Spark 的主要切入点,由于 RDD 是主要的 API,我 们通过 sparkContext来创建和操作 RDD。对于每个其他的 API,我们需要使用不同的 context。 例如:

对于 Spark Streaming,我们需要使用 StreamingContext
对于 Spark SQL,使用 SQLContext
对于 Hive,使用 HiveContext

但是随着 DataSet 和 DataFrame 的 API 逐渐成为标准的 API,就需要为他们建立接入点。所 以在 Spark2.0 中,引入 SparkSession 作为 DataSet 和 DataFrame API 的切入点,SparkSession 封装了 SparkConf、SparkContext 和 SQLContext。为了向后兼容,SQLContext 和 HiveContext 也被保存下来。

SparkSession 实质上是 SQLContext 和 HiveContext 的组合,所以在 SQLContext 和 HiveContext 上可用的 API 在 SparkSession 上同样是可以使用的。SparkSession 内部封装了 SparkContext, 所以计算实际上是由 SparkContext 完成的。

特点:
---- 为用户提供一个统一的切入点使用 Spark 各项功能
---- 允许用户通过它调用 DataFrame 和 Dataset 相关 API 来编写程序
---- 减少了用户需要了解的一些概念,可以很容易的与 Spark 进行交互
---- 与 Spark 交互之时不需要显示的创建 SparkConf、SparkContext 以及 SQlContext,这些对 象已经封闭在 SparkSession 中
---- SparkSession 提供对 Hive 特征的内部支持:用 HiveQL 写 SQL 语句,访问 Hive UDFs,从 Hive 表中读取数据。

SparkSession 的创建:

//scala代码:
val spark = SparkSession.builder()
            .master("local[2]")
            .appName("_02SparkSQLUDFOps")
            //            .enableHiveSupport()
            .getOrCreate()

3、RDD/DataFrame/DataSet

3.1、RDD 的局限性

RDD 仅表示数据集,RDD 没有元数据,也就是说没有字段语义定义 RDD 需要用户自己优化程序,对程序员要求较高
从不同数据源读取数据相对困难,读取到不同格式的数据都必须用户自己定义转换方式 合并多个数据源中的数据也较困难

3.2、什么是 DataFrame

首先回忆一下之前的 SparkCore 的 RDD 编程: Spark Core 编程:
1)首先要找到程序入口(SparkContext)
2)通过程序入口构建一个 RDD(核心的抽象 RDD)
3)对写 RDD 进行 Transformation 或者 Action 的操作
4)对最后的结果进行处理(输出或者存入数据库等)

由于 RDD 的局限性,Spark 产生了 DataFrame。
其中 Schema 是就是元数据,是语义描述信息。 在 Spark1.3 之前,DataFrame 被称为 SchemaRDD。以行为单位构成的分布式数据集合,按 照列赋予不同的名称。对 select、fileter、aggregation 和 sort 等操作符的抽象。

DataFrame = RDD+Schema = SchemaRDD

内部数据无类型,统一为 Row DataFrame 是一种特殊类型的 Dataset,DataSet[Row] = DataFrame DataFrame 自带优化器 Catalyst,可以自动优化程序 DataFrame 提供了一整套的 Data Source API

DataFrame 的官方解释
http://spark.apache.org/docs/latest/sql-programming-guide.html#datasets-and-dataframes

与 RDD 类似,DataFrame 也是一个分布式数据容器。然而 DataFrame 更像传统数据库的二维 表格,除了数据以外,还记录数据的结构信息,即 Schema。同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。从 API 易用性的角度上 看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。由于与 R 和 Pandas 的 DataFrame 类似,Spark DataFrame 很好地继承了传统单机数据分析的开发体验。
在这里插入图片描述

DataFrame 特点:

1、Ability to scale from kilobytes of data on a single laptop to petabytes on a large cluster(支持 单机 KB 级到集群 PB 级的数据处理)

2、Support for a wide array of data formats and storage systems(支持多种数据格式和存储系 统)

3、State-of-the-art optimization and code generation through the Spark SQL Catalyst optimizer (通过 Spark SQL Catalyst 优化器可以进行高效的代码生成和优化)

4、Seamless integration with all big data tooling and infrastructure via Spark(能够无缝集成所 有的大数据处理工具)

5、APIs for Python, Java, Scala, and R (in development via SparkR)(提供 Python, Java, Scala, R 语言 API)

Spark SQL 编程:

1)首先要找到程序入口(SQLContext),新版本 Spark-2.x 之后寻找 SparkSession

2)通过程序入口构建一个 DataFrame(核心的抽象 DataFrame)

3)对 DataFrame 做各种操作。最重要就是编写 SQL 语句

4)对得到的结果数据进行处理(打印输出或者存入数据库等

3.3、DataSet 的产生

由于 DataFrame 的数据类型统一是 Row,所以 DataFrame 也是有缺点的。
Row 运行时类型检查,比如 salary 是字符串类型,下面语句也只有运行时才进行类型检查。

dataframe.filter("salary>1000").show() 

明显的缺点:
1、Row 不能直接操作 domain 对象
2、函数风格编程,没有面向对象风格的 API

所以,Spark SQL 引入了 Dataset,扩展了 DataFrame API,提供了编译时类型检查,面向对 象风格的 API。
Dataset 可以和 DataFrame、RDD 相互转换。DataFrame=Dataset[Row] 可见 DataFrame 是一种特殊的 Dataset。

3.4、为什么需要 DataFrame 和 Dataset

我们知道 Spark SQL 提供了两种方式操作数据:
1.SQL 查询
2.DataFrame 和 Dataset API
既然 Spark SQL 提供了 SQL 访问方式,那为什么还需要 DataFrame 和 Dataset 的 API 呢? 这是因为 SQL 语句虽然简单,但是 SQL 的表达能力却是有限的(所以 Oracle 数据库提供了 PL/SQL)DataFrame 和 Dataset 可以采用更加通用的语言(Scala 或 Python)来表达用户的
查询请求
。此外,Dataset 可以更快捕捉错误,因为 SQL 是运行时捕获异常,而 Dataset 是 编译时检查错误

3.5、Spark SQL 程序基本编写步骤

1.创建SparkSession对象
SparkSession 封装了 Spark SQL 执行环境信息,是所有 Spark SQL 程序唯一的入口。 // 构建 SparkSQL 程序的编程入口对象 SparkSession

val sparkSession:SparkSession = SparkSession.builder() 
  .appName("MyFirstSparkSQL") 
  .config("someKey", "someValue") 
  .master("local") 
  .getOrCreate() 

2、创建 DataFrame 或 Dataset
Spark SQL 支持多种数据源,包括常见的 JSON,JDBC,Parquet,HDFS,提供了读写各种格式 数据的 API
在这里插入图片描述
3、在 DataFrame 或 Dataset 之上进行转换和 Action
Spark SQL 提供了多钟转换和 Action 函数
在这里插入图片描述

**4、返回结果 **
保存结果到 HDFS 中,或直接打印出来

3.6、创建 DataFrame

1、在本地创建一个文件,有五列,分别是 id、name、sex、age、department,用空格分隔, 然后上传到 HDFS 上
hdfs dfs -put student.txt /student

在这里插入图片描述
2、在 spark shell 执行下面命令,读取数据,将每一行的数据使用列分隔符分割

val lineRDD = sc.textFile("hdfs://myha01/student/student.txt").map(_.split(",")) 

3、定义 case class(相当于表的 schema)

case class Student(id:Int, name:String, sex:String, age:Int, department:String) 

4、将 RDD 和 case class 关联

val studentRDD = lineRDD.map(x => Student(x(0).toInt, x(1), x(2), x(3).toInt, x(4)))

5、将 RDD 转换成 DataFrame Spark-2.3 :

val studentDF = spark.createDataFrame(studentRDD) Spark-1.6 : val studentDF = studentRDD.toDF 

6、对 DataFrame 进行处理

studentDF.show studentDF.printSchema 

7、结果验证 如果使用 Spark-2.3.0 版本:

在这里插入图片描述


在这里插入图片描述

记得点赞加关注!!! 不迷路 !!!
人活着真累:上车得排队,爱你又受罪,吃饭没香味,喝酒容易醉,挣钱得交税!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

蛋蛋淡淡定

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

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

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

打赏作者

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

抵扣说明:

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

余额充值