RDD是Spark建立之初的核心API。RDD是不可变分布式弹性数据集,在Spark集群中可跨节点分区,并提供分布式low-level API来操作RDD,包括transformation和action。
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是Spark中最基本的数据抽象,它代表一个不可变、可分区、里面的元素可并行计算的集合。RDD具有数据流模型的特点:自动容错、位置感知性调度和可伸缩性。RDD允许用户在执行多个查询时显式地将工作集缓存在内存中,后续的查询能够重用工作集,这极大地提升了查询速度。
使用RDD的一般场景:
- 你需要使用low-level的transformation和action来控制你的数据集;
- 你的数据集非结构化,比如:流媒体或者文本流;
- 你想使用函数式编程来操作你的数据,而不是用特定领域语言(DSL)表达;
- 你不在乎schema,比如,当通过名字或者列处理(或访问)数据属性不在意列式存储格式;
- 你放弃使用DataFrame和Dataset来优化结构化和半结构化数据集。
DataFrame与RDD相同之处,都是不可变分布式弹性数据集。不同之处在于,DataFrame的数据集都是按指定列存储,即结构化数据。类似于传统数据库中的表。DataFrame的设计是为了让大数据处理起来更容易。DataFrame允许开发者把结构化数据集导入DataFrame,并做了higher-level的抽象;DataFrame提供特定领域的语言(DSL)API来操作你的数据集。
在Spark2.0中,DataFrame API将会和Dataset API合并,统一数据处理API。
什么时候使用DataFrame或者Dataset?
- 你想使用丰富的语义,high-level抽象,和特定领域语言API,那你可以使用DataFrame或者Dataset;
- 你处理的半结构化数据集需要high-level表达,filter,map,aggregation,average,sum,SQL查询,列式访问和使用lambda函数,那你可以使用DataFrame或者Dataset;
- 你想利用编译时高度的type-safety,Catalyst优化和Tungsten的code生成,那你可以使用DataFrame或者Dataset;
- 你想统一和简化API使用跨Spark的Library,那你可以使用DataFrame或者Dataset;
- 如果你是一个R使用者,那你可以使用DataFrame或者Dataset;
- 如果你是一个Python使用者,那你可以使用DataFrame或者Dataset。
DataFrame是一种分布式数据集合,每一条数据都由几个命名字段组成。概念上来说,她和关系型数据库的表 或者 R和Python中的data frame等价,只不过在底层,DataFrame采用了更多优化。DataFrame可以从很多数据源(sources)加载数据并构造得到,如:结构化数据文件,Hive中的表,外部数据库,或者已有的RDD。
Spark SQL 是spark中用于处理结构化数据的模块。Spark SQL相对于RDD的API来说,提供更多结构化数据信息和计算方法。Spark SQL 提供更多额外的信息进行优化。可以通过SQL或DataSet API方式同Spark SQL进行交互。
DataSet是分布式的数据集合。它集中了RDD的优点(强类型 和可以用强大lambda函数)以及Spark SQL优化的执行引擎。DataSet可以通过JVM的对象进行构建,可以用函数式的转换(map/flatmap/filter)进行多种操作.
RDD、DataFrame、Dataset三者有许多共性,有各自适用的场景常常需要在三者之间转换