教程目录
0x00 教程内容
- Spark SQL相关概念
- Spark SQL 实战初体验
0x01 Spark SQL相关概念
1. Spark SQL介绍
Spark SQL 作为 Spark 四大核心组件之一,主要用于处理结构化数据
或半结构化数据
,它支持在Spark 中使用 SQL
对数据进行查询,还可以从各种外部数据源
中导入数据并将其进行处理。它会提供底层的优化操作
让我们更加关注于具体的数据操作,而非底层运行细节。在处理大量的数据操作时表现得非常优秀。
处理数据
通过 Spark SQL 我们可以像平时使用 SQL 语句去分析关系型数据库表
一样去对 Spark 上的海量数据进行快速分析与处理,我们只需专注数据分析的逻辑
而不需要担心底层分布式存储
、计算
、通信
、以及作业解析
和调度
的细节。
多种数据源
Spark SQL 支持从 JSON 文件
、CSV 文件
、Hive 表
、Parquest 文件
等中读取数据,可以通过 SQL 语句对数据进行交互式查询
;也可以读取传统关系型数据库
中的数据进行分析。同时还能与传统的 RDD 编程
相结合,让我们能够同时使用 SQL 和 RDD
进行复杂的数据分析。
与Spark生态其他组件完美搭配
Spark SQL 还能与其它核心组件比如: Spark Streaming
、MLlib
、GraphX
等结合使用,天生兼容完美搭配,发挥强大性能, Spark SQL
的作用是非常大的。
2. DataFrame介绍
DataFrame
是 Spark SQL 的核心数据抽象。对于输入的待处理数据,我们既可以将其转化为 DataFrame,然后通过调用 DataFrame API
的方式进行处理;也可以将 DataFrame 注册成临时表
,在临时表上直接使用SQL
进行数据查询。
此处需要注意的是 DataFrame 与 RDD 之间的区别:RDD 是整个 Spark 平台的一种基本通用的数据抽象,它更具有通用性,适用于各类数据源,无论是结构化数据
、半结构化数据
或非结构化数据
都会被统一的转化为由同一元素组成的 RDD,在RDD层面上,其实是并不了解每一条数据的内容是什么的;而 DataFrame 是只针对结构化数据源
的高层数据抽象,它能够提取出数据特定的结构信息
,进而能够更加高效的处理结构化数据
。
其实,RDD可以理解为是一列多行的数据结构,而DataFrame可以理解为是多列多行的数据结构。具体请看下面这张图:
RDD只知道这一行数据是什么内容,比如是Person,而DataFrame则有特定的结构,具体知道每一列是什么内容。
0x02 Spark SQL 实战初体验
1. 数据准备
cd /home/hadoop-sny/datas
vi teacher.json
{"name":"shaonaiyi", "age":"30", "height":198}
{"name":"shaonaier", "age":"28", "height":174}
{"name":"shaonaisan", "age":"25", "height":178}
{"name":"shaonaisi", "age":"21", "height":183}
{"name":"shaonaiwu", "age":"32", "height":165}
各字段意思:
name —> 名称
age —> 年龄
height —> 身高
2. Spark SQL初体验
a. 启动 Spark Shell
spark-shell
b. 创建 SparkSession
对象
Spark SQL 编程主入口点是:SparkSession
,我们可以通过SparkSession
的builder()
方法创建一个基本的SparkSession 对象
,并配置一些初始化参数。
在 spark-shell 中输入如下代码:
import org.apache.spark.sql.SparkSession
val spark = SparkSession.builder().appName("PersonApp").getOrCreate()
// 引入包用于把 RDD 隐式转换为 DataFrame
import spark.implicits._
其中,我们也可以在SparkSession后面调用config方法设置相关属性信息,使用示例:
val spark = SparkSession
.builder()
.appName("PersonApp")
.config("spark.some.config.option", "some-value")
.getOrCreate()
c. 创建 DataFrames
对象
应用程序根据上一步创建的 SparkSession 对象提供的 API,可以从现有的 RDD 或其它结构化数据源中创建 DataFrame 对象。
在本例中我们从 JSON 文件创建 DataFrame:
// 创建DataFrame,指明来源自JSON文件
val teacherDF = spark.read.json("/home/hadoop-sny/datas/teacher.json")
其实teacherDF
可以来自各种不同的数据源,但原理都类似,调用不同的创建函数去连接数据源。
下面的步骤中我们将对创建的 DataFrame 进行操作。
d. 对DataFrame进行操作
我们开始对teacherDF
进行处理,处理的方式类似 SQL 操作。
首先打印当前 DataFrame 里的内容:
teacherDF.show()
除了此操作,其他很多操作,将会在下一篇教程中说到。
0xFF 总结
- 本篇教程简单地介绍了Spark SQL的相关概念,并且初步体验了一下Spark SQL,其实Spark SQL底层也是依赖于 RDD的,重点在于 DataFrame 理解。
- 下一篇会更加详细地介绍Spark SQL的相关操作,请参考教程:Spark SQL快速入门(进阶)
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
邵奈一原创不易,如转载请标明出处,教育是一生的事业。