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 。
---一------步-----一 ------个-----脚--------印----------