Spark 中三种数据处理对象的区别: RDD-Dataset-Dataframe

 

1,对比表:

  RDD Dataframe Dataset
版本 1.0 1.3 1.6
描述 分布式数据集合 行列化的分布式数据集合  RDD 和 DataFrame的结合
数据格式 结构化和非结构化都可以 结构化和半结构化都可以 结构化和非结构化都可以
数据源 多种 多种 多种
不变性和互通性 容易转化为dataframe 转化到dataframe ,失去原RDD. 转化后,原RDD会重新生成
编译类型安全 类型安全 不安全 , 运行时出错 安全
优化器 无内置优化引擎 ,每个 RDD单独优化. 查询经过优化,通过使用 Catalyst optimizer. 和dataframe一样
序列化

使用java 序列化编码数据,花销大;需要在节点之间传输数据及其结构

 

不需要使用java 序列化编码数据 ,序列化只发生在内存二进制中。

 编码器处理 jvm对象和表格的转换,比java 序列化更快

 

垃圾处理

 创建和销毁单个对象时,产生垃圾数据消耗

 创建和销毁对象时,不会产生垃圾数据集

不需要jvm垃圾处理
效率

 单个对象序列化降低效率

 内存内的 序列化消耗小;不需要 反序列化,可直接处理操作序列化数据。

访问单个属性不需要序列化整个对象。
Lazy处理
语言支持 Java Scala Python R Java Scala Python R Java Scala
模式预测 人工定义schema 自动发现数据文件模式 自动发现数据文件模式
聚合操作 聚合和分组操作很困难

 

探索性分析和 聚合统计 性能都 比较好

 

海量数据聚合比较快

 

2,适合使用 RDD的场景

  1,数据是非结构化的,比如 多媒体或者文本流数据

  2,底层次的转化操作适合使用 low - level API 

  3,  模式不重要的场合 。

 

3,适合使用 dataset 的场景

  1,   编译时类型安全对开发者更有效率, 编译器能捕捉大部分错误。 

  2,适合处理结构化 数据和半结构化数据。

  3,高级API 更容易使用  , 适合 数据的 高层次处理,列式函数, sql操作。

 

补充;在spark 2.0 , 把  DataFrame 和 Dataset 合并到一个类。dataset api具有 Strongly-Typed API 和 Untyped API 2 种形式。 Java   和 Scala使用  Strongly-Typed API , 但是因为 python 和 R 是动态语言,使用Untyped API 。

 

posted @ 2022-07-06 15:01  gaussen126  阅读(94)  评论(0编辑  收藏  举报