【SparkSQL】数据抽象和类型

337 阅读2分钟

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

一、数据抽象

SparkSQL 提供了两个新的抽象, 分别是

  • DataFrame
  • DataSet

同样的数据都给到这三个数据结构, 经过系统的计算逻辑, 都得到相同的结果。不同是它们的执行效率和执行方式;

在后期的 Spark 版本中, DataSet 会逐步取代 RDDDataFrame 成为唯一的 API 接口。

RDDDataFrameDataSet 三者共性:

  1. 都是 Spark 平台下的分布式弹性数据集, 为处理海量数据提供便利
  2. 都有许多相同的概念, 如分区、持久化、容错等; 有许多共同的函数, 如 mapfiltersortBy
  3. 都有惰性机制, 只有在遇到 Action 算子时, 才会开始真正的计算
  4. DataFrameDataset 进行操作许多操作都需要这个包进行支持, import spark.implicits._

RDDDataFrameDataSet 三者区别:

  1. DataFrame 每一行的类型固定为 Row , 只有通过解析才能获取各个字段的值
  2. DataFrameDataset 均支持 SparkSQL 的操作
  3. DataFrame 定义为 Dataset[Row]。每一行的类型是 Row, 每一行究竟有哪些字段, 各个字段又是什么类型都无从得知, 只能用前面提到的 getAS 方法或者模式匹配拿出特定字段;
  4. Dataset 每一行的类型都是一个 case class, 在自定义了 case class 之后可以很自由的获得每一行的信息;

(1)DataFrame

DataFrame 的前身是 SchemaRDD

Spark1.3 更名为 DataFrame。不继承 RDD, 自己实现了 RDD 的大部分功能。

RDD 类似, DataFrame 也是一个分布式数据集:

  • DataFrame 可以看做分布式 Row 对象的集合, 提供了由列组成的详细模式信息, 使其可以得到优化。
  • DataFrame 不仅有比 RDD 更多的算子, 还可以进行执行计划的优化。
  • DataFrame 更像传统数据库的二维表格, 除了数据以外, 还记录数据的结构信息, 即 schema
  • DataFrame 也支持嵌套数据类型(structarraymap)
  • DataFrame API 提供的是一套高层的关系操作, 比函数式的 RDD API 要更加友好, 门槛更低
  • Dataframe 的劣势在于在编译期缺少类型安全检查, 导致运行时出错

如图: 2021-02-2017-45-58.png

(2)DataSet

DataSet 是在 Spark1.6 中添加的新的接口;

RDD 相比, 保存了更多的描述信息, 概念上等同于关系型数据库中的二维表;

DataFrame 相比, 保存了类型信息, 是强类型的, 提供了编译时类型检查; 调用 Dataset 的方法先会生成逻辑计划, 然后 Spark 的优化器进行优化, 最终生成物理计划,然后提交到集群中运行。

DataSet 包含了 DataFrame 的功能, 在 Spark2.0 中两者得到了统一: DataFrame 表示为 DataSet[Row], 即 DataSet 的子集。

如图: 2021-02-2017-47-46.png

二、数据类型

详见官网:spark.apache.org/docs/latest…