教程目录
- Spark SQL相关概念
- 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则有特定的结构,具体知道每一列是什么内容。
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快速入门(进阶)
作者简介:邵奈一
全栈工程师、市场洞察者、专栏编辑
| 公众号 | 微信 | 微博 | CSDN | 简书 |
福利:
邵奈一的技术博客导航
邵奈一原创不易,如转载请标明出处,教育是一生的事业。