Spark SQL 初识

Spark SQL 初识

“入门 Spark 需要三步走”,到目前为止,我们携手并肩跨越了前面两步,首先恭喜你学到这里!熟练掌握了 Spark 常用算子与核心原理以后,你已经可以轻松应对大部分数据处理需求了。

不过,数据处理毕竟是比较基础的数据应用场景,想成为 Spark 的资深使用者,我们还要走出第三步——学习 Spark 计算子框架。只有完成这一步,我们才能掌握 Spark SQL,Structured Streaming 和 Spark MLlib 的常规开发方法,游刃有余地应对不同的数据应用场景,如数据分析、流计算和机器学习,等等。

image-20240731100400099

那这么多子框架,从哪里入手比较好呢?在所有的子框架中,Spark SQL 是代码量最多、Spark 社区投入最大、应用范围最广、影响力最深远的那个。就子框架的学习来说,我们自然要从 Spark SQL 开始。

而且在实际工作中,使用频率最高的当属 Spark SQL,通常一个大数据处理项目中,70% 的数据处理任务都是由 Spark SQL 完成,它贯穿于数据预处理、数据转换和最后的数据分析。由于 SQL 的学习成本低、用户基数大、函数丰富,Spark SQL 也通常是使用 Spark 最方便的方式。

由于 Spark 对于 SQL 支持得非常好,而 pandas 在这方面没那么强大,所以,在某些场景,你可以选择 Spark SQL 来代替 pandas,这对于分析师来说非常好用,但是最新版的Spark 已经支持了pandas,这算是数据分析师的福音了。

Spark SQL的地位

首先我们看一下,Spark SQL在Spark家族中的地位

image-20211029100416947

其实我们可以看到Spark SQL 最终还是依赖底层的Spark Core,也就是说最终还是转化到RDD 上执行,既然最终都是转化到RDD 上执行,为什么我们不直接使用RDD 呢,后面我们在解释这个问题。

接下来我们看一下Spark提供的这几个模块在社区中的使用情况,其实从下面的图中我们可到,使用最广泛的还是Spark SQL几乎占据了半壁江山,这也就是我们为什么要重点学习Spark SQL了

img

为什么要有Spark SQL

自从 Spark 社区在 1.3 版本发布了 DataFrame,它就开始代替 RDD,逐渐成为开发者的首选。我们知道,新抽象的诞生一定是为了解决老抽象不能搞定的问题。那么,这些问题都是什么呢?下面,我们就一起来分析一下。

RDD之殇—优化空间有限

自从 Spark 社区在 1.3 版本发布了 DataFrame,它就开始代替 RDD,逐渐成为开发者的首选。我们知道,新抽象的诞生一定是为了解决老抽象不能搞定的问题。那么,这些问题都是什么呢?下面,我们就一起来分析一下。

我们知道在 RDD编程中很多 转换和聚合算子,它们都是高阶函数,例如我们最常用的ma、filter、reduceBykey,高阶函数指的是形参包含函数的函数,或是返回结果包含函数的函数。为了叙述方便,我们把那些本身是高阶函数的 RDD 算子,简称“高阶算子”。

对于这些高阶算子,开发者需要以 Lambda 函数的形式自行提供具体的计算逻辑。以 map 为例,我们需要明确对哪些字段做映射,以什么规则映射。再以 filter 为例,我们需要指明以什么条件在哪些字段上过滤。

但这样一来,Spark 只知道开发者要做 map、filter,但并不知道开发者打算怎么做 map 和 filter。也就是说,在 RDD 的开发模式下,Spark Core 只知道“做什么”,而不知道“怎么做”。这会让 Spark Core 两眼一抹黑,除了把 Lambda 函数用闭包的形式打发到 Executors 以外,实在是没有什么额外的优化空间

对于 Spark Core 来说,优化空间受限最主要的影响,莫过于让应用的执行性能变得低下。一个典型的例子,就是相比 Java 或者 Scala,PySpark 实现的应用在执行性能上相差悬殊。原因在于,在 RDD 的开发模式下,即便是同一个应用,不同语言实现的版本在运行时也会有着天壤之别。

所以这就是为什么Spark SQL一直致力于优化性能

RDD之殇—通用性不高

其实我们知道使用最广泛的编程语言其实是SQL,而且入门门槛低,我们知道Spark底层是使用scala 语言实现的,这也就是我们的spark 编程一般都是使用scala,但是我们很多数据工作者一直都是使用SQL 的。

所以Spark SQL可以弥补Spark在这一方面的不足,但是这不是说Spark SQL就是SQL,它更多的是优化,然后提供了一个 SQL的编程接口。

Spark SQL的底层数据结构DataFrame

针对 RDD 优化空间受限的问题,Spark 社区在 1.3 版本发布了 DataFrame。那么,相比 RDD,DataFrame 到底有何不同呢?我们不妨从两个方面来对比它们的不同:一个是数据的表示形式(Data Representation),另一个是开发算子。

DataFrame,你可以把它看作是一种特殊的 RDD。RDD 我们已经很熟悉了,现在就把 DataFrame 跟 RDD 做个对比,让你先对 DataFrame 有个感性认识。

先从功能分析,与 RDD 一样,DataFrame 也用来封装分布式数据集,它也有数据分区的概念,也是通过算子来实现不同 DataFrame 之间的转换,只不过 DataFrame 采用了一套与 RDD 算子不同的独立算子集

下面是一个例子,我们看到DataFrame有一些类SQL的算子,例如groupBy,agg等

val result: DataFrame = uniqueMultipliers.groupBy("multiplier")
.agg(count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值