RDD、dataframe和dateset區別
這三個是 Spark 里的核心數據抽象,很多人會混淆。我們來逐層對比一下:
1. 概念對比
| 特性 | RDD (Resilient Distributed Dataset) | DataFrame | Dataset |
|---|---|---|---|
| 提出時間 | Spark 最早的數據抽象 (Spark 1.0 就有) | Spark 1.3 引入 | Spark 1.6 引入 |
| 數據結構 | 分布式對象集合(強類型,但無 schema) | 分布式表格數據(有 schema,類似數據庫表) | 介于兩者之間:既有類型安全(編譯期檢查),也有 schema |
| API 風格 | 函數式編程風格 (map, filter, reduce, flatMap...) | 類 SQL 風格 (select, groupBy, agg...) | 同時支持函數式操作 + SQL 風格 |
| 類型安全 | 有(但元素都是 JVM 對象,缺乏 schema 信息) | 無(只有運行時 schema,編譯時不檢查) | 有(編譯器可檢查字段,避免拼寫錯誤等) |
| 優化能力 | 無優化,純計算圖 (DAG) | Catalyst 優化器可以優化查詢計劃 | Catalyst 優化器 + Encoders(序列化優化) |
| 序列化 | Java 序列化或 Kryo,開銷大 | 內部用 Tungsten(更高效的二進制內存表示) | 同 DataFrame(Tungsten),但額外支持類型安全的 Encoders |
| 使用場景 | 復雜底層轉換邏輯,非結構化數據 | 結構化數據處理,大規模 SQL 查詢 | 需要既有類型安全又有高性能結構化計算 |
2. 舉例說明
假設有訂單數據 (orderNo: String, cost: Long):
RDD
?? 特點:面向對象,靈活,但沒有 schema,不能用 SQL。
DataFrame
?? 特點:有 schema,可以直接用 SQL/DSL,很簡潔,但編譯器不會檢查字段名拼寫。
Dataset
Encoder<Order> orderEncoder = Encoders.bean(Order.class); Dataset<Order> ds = spark.read().json("orders.json").as(orderEncoder); Dataset<Row> result = ds.groupBy("orderNo") .agg(functions.sum("cost").alias("totalCost")); result.show();
?? 特點:有 schema,且 Order 是強類型,拼寫錯誤會在編譯時報錯。
3. 總結類比
-
RDD:像一堆 Java 對象集合,靈活但「裸奔」,沒有 schema,優化弱。
-
DataFrame:像數據庫表,有 schema,可以寫 SQL,優化強,但無類型安全。
-
Dataset:折中方案,有 schema + 類型安全,結合 RDD 和 DataFrame 的優勢。
?? 一句話總結:
-
需要靈活復雜操作 → RDD
-
主要做結構化計算、SQL → DataFrame
-
想要類型安全 + 結構化查詢 → Dataset(Java/Scala 推薦)

浙公網安備 33010602011771號