教程目录


0x00 教程内容


  1. Spark SQL相关概念
  2. 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可以理解为是多列多行的数据结构。具体请看下面这张图:

Spark SQL快速入门(基础)_数据

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}

Spark SQL快速入门(基础)_spark_02

各字段意思:

name —> 名称
age —> 年龄
height —> 身高
2. Spark SQL初体验

a. 启动 Spark Shell

spark-shell

Spark SQL快速入门(基础)_大数据_03

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._

Spark SQL快速入门(基础)_sql_04

其中,我们也可以在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")

Spark SQL快速入门(基础)_大数据_05

其实​​teacherDF​​可以来自各种不同的数据源,但原理都类似,调用不同的创建函数去连接数据源。

下面的步骤中我们将对创建的 DataFrame 进行操作。

d. 对DataFrame进行操作

我们开始对​​teacherDF​​进行处理,处理的方式类似 SQL 操作。

首先打印当前 DataFrame 里的内容:

teacherDF.show()

Spark SQL快速入门(基础)_大数据_06

除了此操作,其他很多操作,将会在下一篇教程中说到。

0xFF 总结


  1. 本篇教程简单地介绍了Spark SQL的相关概念,并且初步体验了一下Spark SQL,其实Spark SQL底层也是依赖于 RDD的,重点在于 DataFrame 理解。
  2. 下一篇会更加详细地介绍Spark SQL的相关操作,请参考教程:​​Spark SQL快速入门(进阶)​


作者简介:​邵奈一​

全栈工程师、市场洞察者、专栏编辑

邵奈一原创不易,如转载请标明出处,教育是一生的事业。