Dataset 和 DataFrame 的区别_区别 | 学习笔记

简介: 快速学习 Dataset 和 DataFrame 的区别_区别

开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段Dataset 和 DataFrame 的区别_区别】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/690/detail/12049


Dataset 和 DataFrame 的区别_区别

 

前面我们已经单独介绍过 Dataset,也单独介绍过 DataFrame,接下来,说一说他们两个之间的区别,希望大家能够知道什么时候用 Dataset,什么时候用 DataFrame,你拿到的是一个什么东西。

第一大章节,思考一些问题,首先得到赛车当中支不支持用列来访问数据,是支持的,我们在前面有一个案例当中也写过,Dataset 的执行是不是优化的,就是优化器会不会优化,这个 Dataset 也会,我们也专门的测试过,Dataset 有这个命令式的 API,并且我们可以使用 SQL 语句去访问 Dataset 创建出来的临表。

那 Dataset 可以创建链表,DataFrame 能创建吗?也能,那 Dataset 的执行是优化的,DataFrame 的执行也优化。这个 Dataset 当中可以使用裂来访问数据 DataFrame 可以吗?也可以。

那这个 sparkSQL 搞两个东西专门来混淆,是这样的吗?其实不是。DataFrame 他就是给他塞,我们就要去证明这件事情,在这个位置,这有一个 DataFrame 的对象,我们点进 DataFrame 当中,创建一个类型,这个类型的名字叫做 DataFrame,这个 DataFrame 是什么呢?它是 Dataset 的一个 row 的一个别名。大家有没有发现,也就是说 DataFrame 就是 Dataset。

image.png

什么时候变成 Dataset 呢?其实是在 Spark2.0以后,这点大家要知道,就是之前有单独的一个得分,后来,Spark 搞了一个 DataFrame,就变成了 Dataset 的别名 DataFrame,作为一个更宽泛的一个东西,这是我们所说的第一个点,DataFrame 就是 Dataset,这点大家一定要注意。

DataFrame 和 Dataset 所表达的东西是一样的吗?其实是不一样的。

第一点,DataFrame,它表达的含义是一个支持函数式操作,就是无论 DataFrame 里面放什么,Frame 所表达的含义都是二维元组的一个表。Dataset 表达的是一个类似于 RDD 东西,他代表的是一个强类型的对象,可以通过一点来去证明。

打开 idea,在这个方法里面,我们还是去拿到一个 Person list,然后接下来我们拿到一个 DF,Person list to df,to Df 了以后,可以为其指定他的这个类型,就是给了 free,再拿一个DS,就是通过 person list to DS to DS,就是转成 PDF,这两个方法其实都是通过我们前面所导入的这个隐式转换来完成的。DS 的类型是什么样子是一个 Dataset 里面存放的 personlist,无论你里面是什么数据类型,无论你是 people还是什么,这个 teacher,无论你是任何的一个对象类型,那 DataFrame 永远是 data set 的 row 类型,也就是说的 frame 里面永远存放的是 row 对象,但是对于 Dataset 来说,它里面存放的可以是具体的一个对象,一个类型的对象,所以如果我们要下结论的话,DataFrame 是弱类型的。

怎么理解这句话,很简单,这个 DataFrame 当中,不管存什么都是 row,他很弱了,Dataset 是强类型。

所以,这是 DataFrame 和 Dataset 的最大区别.其他方面的区别,第三点, DataFrame 的操作方式和 Dataset 是一样的,但是,对于强类型的操作而言,他们处理的结果,处理的类型是不同的。

打开 idea,我们继续往下去写一个小的案例,来看一看 DataFrame、 Dataset 进行强力型操作的时候有什么区别?

首先,对于 DF 来说,它可以进行 map,map 当中能拿到 item 吗?也可以,这个item 是一个 row 类型,拿到这个 row 类型以后,我能拿他进行相应的操作,比如呢,我现在这个每个人的年龄都是一个这个十位数的,两位数,所以我们要怎么办呢?

我们要去把这个所有的年龄乘以二,张三,现在30岁,然后李四,现在已经40岁,再发挥一个 row,这个 row 当中,可以通过前面的 row,然后,我们第二个,是可以改成 row.get As 我们第二项,那时候下标为一,然后,我们给他转成 int 类型,那么从这一点大家能看到,我接收的是一个 row 类型,我返回的还是一个row类型。

如果是这样的话,通过前面的这个 row 当中,我是不能取出第一项。直接放在这个row 当中的第一个位置,然后,我能取出第二个元素,并且通过 get As 直接转成 int 类型,类型我们就可以乘以二。

这样其实还不行,你需要去再为其指定一个他的这个 row的一个 incode,你要把这个 person 转成 row,需要这样的一个 incode,这个 incode 我们怎么去用呢?

我们就可以直接通过我们的这个 incode in quarter,然后倒入这个 role in color 这个包.play data frame,我们要为这个 incode指定 schema,那这个时候 DataFrame 里面存的就是 row 是什么意思?

你要为其指定 schema,这个 steamer,是以 row 的 incode 的形式存在,接下来,我们继续再向下就可以去查看里面的内容,我们一会看一看我们转换的是否正确。

再继续看,对于 Dataset 来说,它的这个 map 是来干啥的呢?它里面接收的是什么呢?接触的直接就是一个 person,我们去看一看,转一下 person,冒号 person ,我们拿到这个 person 来进行。

我们也返回一个新的 person 对象回去,怎么返回呢?然后,我们 person,: person,怎么转呢?转成一个 person 对象。这个 person 对象当中,从 person 当中直接取 name,这都跟刚才不一样,刚才你是按照这个下标来去的,现在直接去,再来一个 person age,然后乘以二。

这个时候,我们在进行另起一行首拍,他俩实现的功能完全一模一样,大家要注意一点,一个操作的是 row 对象,永远操作 row 对象,无论你是从什么对象转过来的,总之你操作一下,一个是你里面存放什么类型的对象,你都操作什么类型的对象。

我们来去运行这段代码,我们这个代码,已经运行成功,第一个 show 返回的是 name age,然后张三30,李四40。接下来,我们再继续往下滚动滚动,第二个 show 是不是也返回同样的结果?

所以,说明我们这个是没有问题的,总结,就是 DataFrame 的操作方式,和这个是一样的,因为 DataFrame 就是,但是,对于强类型的操作而言,如果你要使用 map 的话,在 DataFrame 当中拿到的是一个 row 对象,在 Dataset 当中拿到的是一个 person 对象。

People 对象或者任何其他任何的这种对象类型,接下来我们再继续下看DataFrame,只能做到运行时的类型。

Dataset 能做到编译时和运行时都有类型检查,这一点怎么理解呢?首先我们进入到 idea 当中,在 idea 当中首先对于这个 DataFrame 来说,DataFrame 里头都是一些 Group,你的这个 Group,一般情况下会写 Name 或者 age 这样的东西,这一段东西在编译的时候,你及时写错了,写成了 SQL。这个时候编译器报错吗?idea报错吗?没有,所以,DataFrame 所代表的弱类型操作。

弱类型操作编译时不安全的,只有在运行的时候,这里没有 SQL,对于 Dataset 来说,Dataset a,比如说我看 sight,你看 a group by group,就可以直接去按照这个 person 把这个 K 来进行相应的转换,甚至来说,我们这个 Dataset 所代表的是强类型的操作,这个时候,在 filter 当中,直接能拿到 person 对象。

通过person对象进行相应的操作,如果是这样的话,这个 person 直接点一个 SQL,点不出来,我们才说这个 Dataset 其实是一个编译时类型安全的。

 

Dataset 所代表的操作是类型安全的。编译是安全的,这也是他们之间的一个区别,原因是什么呢?

DataFrame 当中依然也可以使用这种类似于强类型的这样的一个操作方式,但是,对于 DataFrame 来说,即使是拿到强类型的操作,但是其实还是通过 row 来进行操作。

对于 Dataset 来说,他确实能拿到某一个对象,这个类型就决定了这个对象应该怎么操作。所以,这个 DataFrame 确实就是一个是变异性安全编译是安全的,一个是编译是不安全的。

我们进入到导图当中,对我们刚才这一部分做一个简单的总结,DataFrame 的区别是什么呢?

首先第一点,DataFrame 代表什么?就是 Dataset 里面放的是一个 row 类型的对象。然后,我们在 DataFrame 代表弱类型的操作,然后,Dataset 代表强类型的操作。

在拿到类型的时候,DataFrame 中的这个类型永远是 row,然后,这个 DataFrame 可以做到运行时类型安全,但是,Dataset 可以做到编译时和运行时都安全。

相关文章
|
8月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(四)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(四)
|
SQL 数据挖掘 数据处理
DataFrame(4):DataFrame的创建方式
DataFrame(4):DataFrame的创建方式
DataFrame(4):DataFrame的创建方式
|
3月前
|
SQL 分布式计算 Java
Spark中的DataFrame和Dataset有什么区别?请解释其概念和用途。
Spark中的DataFrame和Dataset有什么区别?请解释其概念和用途。
70 0
|
8月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(七)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(七)
|
8月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(三)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(三)
|
8月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(一)
Pandas中DataFrame的属性、方法、常用操作以及使用示例
|
8月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(六)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(六)
|
8月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(二)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(二)
|
8月前
|
Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(五)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(五)
|
10月前
|
SQL 存储 分布式计算
Spark DataSet 和 DataFrame 的区别
Spark DataSet 和 DataFrame 的区别
131 0