提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
第一章 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 转换