这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
一、数据抽象
SparkSQL 提供了两个新的抽象, 分别是
DataFrameDataSet
同样的数据都给到这三个数据结构, 经过系统的计算逻辑, 都得到相同的结果。不同是它们的执行效率和执行方式;
在后期的 Spark 版本中, DataSet 会逐步取代 RDD 和 DataFrame 成为唯一的 API 接口。
RDD、DataFrame 和 DataSet 三者共性:
- 都是
Spark平台下的分布式弹性数据集, 为处理海量数据提供便利 - 都有许多相同的概念, 如分区、持久化、容错等; 有许多共同的函数, 如
map、filter、sortBy等 - 都有惰性机制, 只有在遇到
Action算子时, 才会开始真正的计算 - 对
DataFrame和Dataset进行操作许多操作都需要这个包进行支持,import spark.implicits._
RDD、DataFrame 和 DataSet 三者区别:
DataFrame每一行的类型固定为Row, 只有通过解析才能获取各个字段的值DataFrame与Dataset均支持SparkSQL的操作DataFrame定义为Dataset[Row]。每一行的类型是Row, 每一行究竟有哪些字段, 各个字段又是什么类型都无从得知, 只能用前面提到的getAS方法或者模式匹配拿出特定字段;Dataset每一行的类型都是一个case class, 在自定义了case class之后可以很自由的获得每一行的信息;
(1)DataFrame
DataFrame 的前身是 SchemaRDD。
Spark1.3更名为DataFrame。不继承RDD, 自己实现了RDD的大部分功能。
与 RDD 类似, DataFrame 也是一个分布式数据集:
DataFrame可以看做分布式Row对象的集合, 提供了由列组成的详细模式信息, 使其可以得到优化。DataFrame不仅有比RDD更多的算子, 还可以进行执行计划的优化。DataFrame更像传统数据库的二维表格, 除了数据以外, 还记录数据的结构信息, 即schemaDataFrame也支持嵌套数据类型(struct、array和map)DataFrame API提供的是一套高层的关系操作, 比函数式的RDD API要更加友好, 门槛更低Dataframe的劣势在于在编译期缺少类型安全检查, 导致运行时出错
如图:
(2)DataSet
DataSet 是在 Spark1.6 中添加的新的接口;
与 RDD 相比, 保存了更多的描述信息, 概念上等同于关系型数据库中的二维表;
与 DataFrame 相比, 保存了类型信息, 是强类型的, 提供了编译时类型检查; 调用 Dataset 的方法先会生成逻辑计划, 然后 Spark 的优化器进行优化, 最终生成物理计划,然后提交到集群中运行。
DataSet 包含了 DataFrame 的功能, 在 Spark2.0 中两者得到了统一: DataFrame 表示为 DataSet[Row], 即 DataSet 的子集。
如图: