Dataframe原理要点
Spark SQL引入了一个名为DataFrame的表格函数数据抽象。设计它的目的在于:简化Spark应用程序的开发。这样就可以在Spark基础架构上处理大量结构化表格数据。

DataFrame是一种数据抽象或特定于域的语言(domain-specific language ),用于处理结构化和半结构化数据,比如:你可以为数据集指定一个表结构(schema)。

DataFrame是一个带有表结构信息的行数据集合,表结构是执行结构化查询的结果(一旦执行完毕)。

DataFrame使用RDD的不可变,内存,弹性,分布式和并行功能,并将schema(表结构)应用于数据。

所以,在spark中,DataFrame是带RowEncoder的行数据集。DataFrame的定义是: type DataFrame = Dataset[Row]

DataFrame被组织成行和指定列的表格数据的分布式数据集合。它在概念上等效于关系数据库中的表,它包括基于该数据集之上的各种算子,后续会对这些算子的实现进行详细说明。

与Pandas类似,DataFrame借用了DataFrame的概念,但在Spark SQL中,DataFrame是不可变的,并行的(一台机器,可能有许多处理器和内核)和分布式(许多机器,可能有许多处理器和内核)。

DataFrame构建于RDD之上,不过它对RDD进行了操作和优化,然后提供给用户的是一个结构化的DataFrame。这样,它就可以处理海量数据。

DataFrame是“通用”Row实例(作为RDD [Row])和schema的集合。

Dataframe返回通用[[Row]]对象,这些对象允许按索引顺序(index)或列名(name)访问字段。

在spark2.4中,DataFrame等效于Spark SQL中的关系表,可以使用SparkSession中的各种函数创建。

注意:Dataframe是若类型的,而DataSet是强类型的。

DataFrame和DataSet
数据格式

DataFrame

Dataframes按命名列的方式组织数据。它可以有效的处理结构化和非结构化数据。并允许spark管理schema(表结构)。
DataSets

和Dataframe一样,它也能有效的处理结构化和非结构化数据。但它按行对象(row object)集合或行的JVM对象的形式表示数据。通过编码器(Encoder),以表格形式表示。

数据表示
DataFrame

在Dataframe中组织成命名列。基本上,它与关系数据库中的表相同。

DataSet

我们知道,它是dataframe API的扩展,它提供了RDD API的类型安全,面向对象的编程接口的功能。此外,会通过Catalyst查询优化器的进行性能优化。

不可变性和互操作性
DataFrame

一旦转换为Dataframe,我们就无法重新生成域对象。

DataSets

Datasets克服了从dataframe产生RDD的缺陷。而且也允许把一个存在的RDD或dataframe转换成dataset。

数据源API
DataFrame

允许以不同格式进行数据处理,例如AVRO,CSV,JSON和存储系统HDFS,HIVE表,MySQL。

DataSets

它还支持来自不同来源的数据。

懒评价(Lazy Evolution)
和RDD类似,两者都是懒评价的。

效率/内存使用
DataFrame

通过使用堆外内存(off heap memory)进行序列化,减少开销。

DataSets

DataSets-它允许对序列化数据执行操作。此外,提高内存使用率。

优化
DataFrame

使用spark catalyst optimizer进行优化,可以在dataframe内部进行优化。

DataSets

对于查询计划的优化,它提供了dataframe catalyst optimizer的概念。

编程语言支持
DataFrame

提供4种语言,如Java,Python,Scala和R数据帧。

DataSets

仅在Scala和Java中可用。

Datasets and Dataframes的使用
DataFrame

具有高层抽象。
也会对执行进行优化。
可以使用对外内存,使得内存的使用不会过载。
会比RDD有更好的执行性能。
DataSets

为了在运行时的高度安全性。
利用类型化的JVM对象。
此外,利用催化剂优化器。
节省空间。
它需要更快的执行。

DataSet和DataFrame的区别概述
DataSet

Dataset是分布式数据集合。
Dataset是Spark 1.6中添加的一个新接口,它结合了RDD的优势(强类型,使用强大的lambda函数的能力)和Spark SQL优化执行引擎的优点。
DataSet可以从JVM对象构造,然后使用转换(transformations)函数(map,flatMap,filter等)进行操作。
DataSet API在Scala和Java中可用。Python没有对Dataset API的支持。
但由于Python的动态特性,数据集API的许多好处已经可用(即您可以通过名称自然地访问行的字段row.columnName)。R的情况类似。

DataFrame

DataFrame是一个组织成具有命名列的DataSet。

它在概念上等同于关系数据库中的表或R / Python中的数据框,但在底层具有更丰富的优化。

DataFrame可以从多种来源进行构建,例如:结构化数据文件,Hive中的表,外部数据库或现有RDD。

DataFrame API在Scala,Java,Python和R中可用。在Scala和Java中,DataFrame由行数据集表示。在Scala API中,DataFrame只是Dataset [Row]的类型别名。而在Java API中,用户需要使用Dataset 来表示DataFrame。

RDD和Dataframe,Dataset的总结
图片说明

总结
我们可以看到apache spark中的Dataframe和Dateset都允许自定义视图和结构。此外,两者都提供高级域特定操作。还节省空间,并以高速执行。因此,通过分析Dataframe与Dataset之间的差异,我们可以从满足我们要求的数据框或数据集中选择一个。

转发自:https://blog.csdn.net/zg_hover/article/details/92083012