RDD、DataFrame、Dataset

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三者有许多共性,有各自适用的场景常常需要在三者之间转换

 

猜你喜欢

转载自www.cnblogs.com/playforever/p/9203583.html
今日推荐