开发者学堂课程【大数据Spark2020版(知识精讲与实战演练)第五阶段:Structure_介绍历史更迭 】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/692/detail/12140
Structure_介绍历史更迭
内容介绍:
一. 编程模型的进化过程
二. RDD , DataFrame 和 Dataset 的优缺点
三.总结
一.编程模型的进化过程
本节开始 Structured Streaming 的学习, Structured Streaming 是 Spark Streaming 的进化版,所以在了解 Structured Streaming 之前我们可以先了解一下 Spark Streaming ,我们还需要了解 spark API 的过程以便理解为何在 Spark Streaming 之上要增加一个 Structured Streaming 这个概念。
第一章节进行回顾和展望,了解过去 spark 是如何进步的,在未来 spark 可能发生什么变化,此过程我们需学习三个知识点。编程模型的进化过程,序列化的进化过程,Spark Streaming 和 Structured Streaming 之间的区别
Structured Streaming 相对于 Spark Streaming 在编程上进步了很多, spark 的变成模型是怎么进化的,大概沿着一个什么样的路径在变化。理解这个要点能够帮助我们理解 Structured Streaming ,编程模型和内在的解决方案是什么。
二.RDD , DataFrame 和 Dataset 的优缺点:
1.编程模型 RDD 的优点和缺陷
RDD 的好处有很多,首先其可以直接使用函数式的 API 来进行处理,如以下的词频统计,如果写一个 mapproduce 程序会非常困难,而 RDD 使整个 API 得到很大的简化,
rdd.flatMap(.split(""))
.map((_1))
.reduceByKey(_+_)
.collect
而 flatmap 可以处理任意类型的对象,即 RDD 后面可以是任何类型的对象,
举个例子
val rdd1=……
(可以是任何情况得到的 RDD )
val rdd2:RDD[String]=rdd1.flatMap
val rdd3:RDD[(String,Int)]=rdd2.map
所以 RDD 后面的范型可以是任意对象类型,也是其比较高级的用法。 RDD 可以处理 person 对象,可以处理 student 对象,可以处理 employee 对象以及 teacher 对象,包括 people 对象, user 对象等。因为 RDD 无法感知对象,只会将对象当成数据进行序列化,然后反序列化帮助你进行相应的操作。
(1)优点:
针对自定义数据对象进行处理,可以处理任意类型的对象,比较符合面向对象
(2)缺点:
无法感知对象类型,无法感知数据结构,使用时造成了一些困扰,无法针对数据结构进行编程,没有对结构化数据进行 API 层面的优化。使用 RDD 时,把这个对象当成一个黑盒子,过程中没有上层的优化。
2.编程模型 DataFrame 的优点和缺陷
spark.read
.csv("...")
.where($"name”=!="")
.groupBy($"name")
.show()
(1)优点:
DataFrame 保留有数据的元信息(数据是怎样的,由哪些列组成), API 针对数据的结构进行处理,例如说可以根据数据的某一列进行排序或者分组。
(在 RDD 中这并不容易实现,虽然有 group ,但是和 DataFrame 当中直接针对某一个字段进行 group 相比差距很大 ),2011 年有 RDD ,到 2013 年出现了DataFrame ,DataFrame 在执行的时候会经过 Catalyst 进行优化,可以减少因程序员写法错误造成的性能损失,并且序列化更加高效。性能会更好, DataFrame 存储数据是列式的,在大数据的处理当中列式的会更加高效。
(2)缺点:
使用 map 的时候都拿到的是一个 row 对象,都要通过这个 row 对象来进行操作。所以 DataFrame 可以感知到数据结构,但是它是无类型的,它所有的类型都是 row ,所以 DataFrame 只能处理结构化的数据,它无法处理非结构化的数据。因为 DataFrame 内部使用 row 对象来保存数据。
Spark 为 DataFrame 设计了新的读写框架,也就是说正常情况下 RDD 只能通过 text file 来去读,但是 DataFrame 可以使用 spark.read 然后 CSV,然后 parkey Jason, 可以直接读某一种格式的这个文件。
这是 DataFrame 一个很大的进化点, DataFrame 有一个缺点,只能处理结构化数据。所以 Spark 又在 2015 年的时候出现了 Dataset。
3.编程模型 Dataset 缺陷
spark.read
.csv("...")
.as[Person]
.where(_.name!= ""
.groupByKey(_.name)
.count()
.show()
(1)优点:
Dataset 在 15 年产生, Dataset 它的目标就是为了代替掉 DataFrame,在 Spark 1.6 出现了这个 Dataset 以后,DataFrame 就变成了 Dataset 的一个附庸。
DataFrame 这个类型其实就是 Dataset ,它里面放了 row 这样的类型,所以 Dataset 具有 DataFrame 里面所有的 API ,但是 Dataset 当中不只可以存放 row 对象,它可以存放 person 对象、 string 对象、student 对象、 teacher 对象等,各种对象都可以存。并且 Dataset 可以使用有类型的 API。
正常情况下,在 DataFrame 当中都是拿 row 来操作,所以 DataFrame 当中永远都是根据某一个列来进行处理的,但是 Dataset 当中可以使用一整个对象来进行处理。比如说这个对象中有一个 name ,可以把这个 name group 一下,这是 Dataset 的好处。也就是说 Dataset 结合了 RDD 有对象类型的特点和 DataFrame 代码经过优化再执行的特点,也结合了 DataFrame 针对结构化数据来进行优化的特点。所以从 API 的角度上来讲, dataset 可以支持任何类型的结构化数据的处理,也可以处理非结构化数据。
DataFrame 的性能优势 Dataset 上也有, Dataset 的有类型 API 和无类型 API 都会经过 Catalyst 优化器来进行优化。
在学习此章节我们需要注意一个问题,并不是因为 RDD 有问题,我们才研究出 DataFrame , 用 RDD 的时候我们并未发现其有什么缺陷,直到 DataFrame 出现,我们才意识到 RDD 实则不是很高级, API 的进化是一个隐性的过程。
目前在使用 Dataset 时也并未发现很多问题,也许将来出现了一个新的模型我们才能意识到其存在一些问题。
三.总结
1.RDD 的优缺点:
(1)优点: RDD 是面向对象的,在操作的时候可以直接拿到对象。并且 RDD 可以处理任何类型数据。
(2)缺点: RDD 运行速度比较慢,执行的过程没有经过优化,任何的一个关系型数据库,它在执行 secret 语句的时候一定会经过优化,优化以后确实会比较快。RDD 的 API 会比较僵硬一些,对结构化的数据的访问没有任何的优化,所以使用不是很便利。
2.DataFrame 的优缺点:
(1)优点: DataFrame 针对结构化数据高度优化,可以直接使用某一个列,某一个字段去操作和访问数据。增加了 Catalyst 优化器,会优化一整个执行的过程。
在这个 DataFrame 当中是先生成这个逻辑计划,经过一系列的优化生成物理计划,再经过成本模型选择一个更好的物理计划,然后再去执行。
(2)缺点: DataFrame 的优点其实也是缺点,DataFrame 只能支持结构化数据的操作,这一点是一个硬伤。并且 DataFrame 当中无类型的 API ,有时候可能没有那么的方便。
3.Dataset 的优势
SQL 明显也有缺点,我们利用 Dataset 结合 DataFrame 和 RDD 的优缺点, Dataset 结合了 RDD 和 DataFrame 的 API 既可以处理结构化数据,也可以处理非结构化数据,既包含了有类型的 API 也有无类型的 API ,可以灵活的选择。