Spark SQL

Spark SQL 是 Spark 的结构化数据处理模块,提供DataFrame和DataSet两种数据抽象。DataFrame是带有schema的分布式数据集,类似数据库表格,支持SQL查询和DSL操作。DataSet是DataFrame的扩展,具备RDD的类型安全和查询优化。本篇介绍了DataFrame和DataSet的创建、转换及SQL操作。

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

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


第一章 SparkSQL概述

1.1 SprkSQL是什么

Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块。

1.2 DataFrame是什么

在 Spark 中,DataFrame 是一种以 RDD 为基础的分布式数据集,类似于传统数据库中 的二维表格。DataFrame 与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame 所表示的二维表数据集的每一列都带有名称和类型。这使得 Spark SQL 得以洞察更多的结构 信息,从而对藏于 DataFrame 背后的数据源以及作用于 DataFrame 之上的变换进行了针对性 的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的 具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。 同时,与 Hive 类似,DataFrame 也支持嵌套数据类型(struct、array 和 map)。从 API 易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要 更加友好,门槛更低。
在这里插入图片描述
上图直观地体现了 DataFrame 和 RDD 的区别。 左侧的 RDD[Person]虽然以 Person 为类型参数,但 Spark 框架本身不了解 Person 类的内 部结构。而右侧的 DataFrame 却提供了详细的结构信息,使得 Spark SQL 可以清楚地知道 该数据集中包含哪些列,每列的名称和类型各是什么。

DataFrame 是为数据提供了 Schema 的视图。可以把它当做数据库中的一张表来对待 DataFrame 也是懒执行的,但性能上比 RDD 要高,主要原因:优化的执行计划,即查询计 划通过 Spark catalyst optimiser 进行优化。

1.3 DataSet是什么

DataSet 是分布式数据集合。DataSet 是 Spark 1.6 中添加的一个新抽象,是 DataFrame 的一个扩展。它提供了 RDD 的优势(强类型,使用强大的 lambda 函数的能力)以及 Spark SQL 优化执行引擎的优点。DataSet 也可以使用功能性的转换(操作 map,flatMap,filter 等等)。
DataSet 是 DataFrame API 的一个扩展,是 SparkSQL 最新的数据抽象
用户友好的 API 风格,既具有类型安全检查也具有 DataFrame 的查询优化特性;
用样例类来对 DataSet 中定义数据的结构信息,样例类中每个属性的名称直接映射到 DataSet 中的字段名称;
DataSet 是强类型的。比如可以有 DataSet[Car],DataSet[Person]。
DataFrame 是 DataSet 的特列,DataFrame=DataSet[Row] ,所以可以通过 as 方法将 DataFrame 转换为 DataSet。Row 是一个类型,跟 Car、Person 这些的类型一样,所有的 表结构信息都用 Row 来表示。获取数据时需要指定顺序。


第二章 SparkSQL核心编程

2.1 DataFrame

Spark SQL 的 DataFrame API 允许我们使用 DataFrame 而不用必须去注册临时表或者 生成 SQL 表达式。DataFrame API 既有 transformation 操作也有 action 操作。

2.1.1 创建 DataFrame

(1) 查看Spark支持创建文件的数据源格式

在这里插入图片描述

(2)在 spark 的 bin/data 目录中创建 user.json 文件
{"username":"zhangsan","age":20}
(3)读取 json 文件创建 DataFrame

在这里插入图片描述

  • 展示结果
    在这里插入图片描述

2.2.2 SQL 语法

(1)读取json文件创建DataFrame

在这里插入图片描述

(2)对DataFrame创建临时表

在这里插入图片描述

(3)通过sql语句查询全表

在这里插入图片描述

(4)结果展示

在这里插入图片描述

(5)对于 DataFrame 创建一个全局表

在这里插入图片描述

(6)通过sql查询全表

在这里插入图片描述

2.2.3 DSL语法

(1)创建一个DataFrame

在这里插入图片描述

(2)查看 DataFrame 的 Schema 信息

在这里插入图片描述

(3) 只查看"username"列数据

在这里插入图片描述

(4)查看"username"列数据以及"age+1"数据

在这里插入图片描述

(5)查看"age"大于"25"的数据

在这里插入图片描述

(6)按照"age"分组,查看数据条数

在这里插入图片描述

2.2.4 RDD 转换为 DataFrame

  • spark-shell 中无需导入,自动完成此操作。
    在这里插入图片描述
  • 通过样例类将RDD转换位DataFrame
    在这里插入图片描述

2.2.5 DataFrame 转换为 RDD

  • DataFrame 其实就是对 RDD 的封装,所以可以直接获取内部的 RDD

在这里插入图片描述

  • 此时得到的 RDD 存储类型为 Row
    在这里插入图片描述

2.3 DataSet

  • DataSet 是具有强类型的数据集合,需要提供对应的类型信息。

2.3.1 创建 DataSet

(1)使用样例类序列创建 DataSet

在这里插入图片描述

(2)使用基本类型的序列创建 DataSet

在这里插入图片描述

2.3.2 RDD转化为DataSet

在这里插入图片描述

2.3.3 DataSet转化为RDD

在这里插入图片描述

2.4 DataFrame 和 DataSet 转换

  • 2.4 DataFrame 和 DataSet 转换

(1)DataFrame转换为DataSet

在这里插入图片描述

(2)DataSet转换为DataFrame

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值