iT邦幫忙

2026 iThome 鐵人賽

DAY 2
0

大家好,我是 Cady,目前就讀資管系,也正在參與 Apache DataFusion 的開源貢獻。

發現 Day 1 忘記介紹自己,來補充一下,免得很像 AI 發文~

我對 Data Engineering 很感興趣,未來也想往資料工程的方向走,希望透過 30 天的鐵人賽,擴展自己對 Query Engine 的理解。

大家可能會有個疑問,就像標題的問句一樣:

為什麼選擇 Rust 與 Apache DataFusion?

今天就來回答這個問題!


Query Engine 需要面對什麼問題?

昨天提到,一段 SQL 從送出到產生結果,中間會經過:

SQL Parsing
    ↓
Logical Plan
    ↓
Logical Optimization
    ↓
Physical Plan
    ↓
Physical Optimization
    ↓
Execution
    ↓
Result

這些工作不只是處理 SQL 字串。

當資料量增加時,Query Engine 還需要面對:

  • 如何有效率地使用 CPU
  • 如何控制記憶體使用量
  • 如何平行處理不同批次或分區的資料
  • 如何避免不必要的資料複製
  • 如何在效能與程式安全之間取得平衡
  • 如何讓不同資料來源與運算元件可以擴充

這也是 Rust 與 DataFusion 開始登場的地方。


為什麼選擇 Rust?

Rust 是一門系統程式語言。它的特色不只是執行速度,也包括對記憶體安全、型別與並行程式的重視。

1. 不依賴 Garbage Collector

有些程式語言會使用 Garbage Collector(GC)自動回收不再使用的記憶體。

Rust 則透過 Ownership(所有權)、Borrowing(借用)與 Lifetime(生命週期)等規則管理記憶體。許多可能造成記憶體問題的操作,會在編譯階段被檢查。

這不代表 Rust 程式一定不會出錯,但它能提早阻止許多常見的記憶體使用錯誤。

對 Query Engine 而言,資料可能以一批一批的方式持續流經不同執行節點。如何管理這些資料的生命週期、避免不必要的複製,是很重要的問題。

2. 適合處理需要效能的工作

Rust 會被編譯成原生程式碼,也提供低階的記憶體與資料結構控制能力。

Query Engine 經常需要進行:

  • 欄位掃描
  • 數值計算
  • 篩選與聚合
  • 排序
  • JOIN
  • 編碼與解碼

這些工作可能需要處理大量資料,因此執行效率與資源使用會直接影響查詢速度。

當然,使用 Rust 不代表程式就會自動變快。資料結構、演算法、I/O 與 Query Plan 仍然很重要;Rust 提供的是一個兼顧效能與安全性的實作基礎。

3. 在並行處理時提供更多檢查

現代 Query Engine 通常會利用多核心 CPU,同時處理不同 Partition 或 RecordBatch。

但是,多執行緒程式可能產生資料競爭、鎖使用錯誤或共享狀態管理問題。

Rust 的型別系統與所有權規則,能在編譯階段協助檢查部分並行存取問題。雖然剛開始可能會覺得編譯器很嚴格,但這些限制也能幫助開發者更明確地思考資料由誰持有、在哪裡被共享。


Apache DataFusion 是什麼?

Apache DataFusion 是使用 Rust 實作、以 Apache Arrow 作為記憶體資料格式的開源 Query Engine。

它提供了許多建構資料系統時需要的能力:

  • SQL 與 DataFrame API
  • Logical Plan 與 Physical Plan
  • Logical Optimizer 與 Physical Optimizer
  • 多執行緒、向量化的查詢執行
  • CSV、JSON、Parquet 與 Avro 等格式支援
  • 自訂資料來源
  • User-Defined Function
  • 自訂 Logical Plan、Execution Plan 與最佳化規則

這表示開發者不需要從零開始實作 SQL Parser、Optimizer 與 Execution Engine,就可以把 DataFusion 嵌入自己的 Rust 專案中。


DataFusion 是一套資料庫嗎?

這裡需要先區分「資料庫」與「查詢引擎」。

一套完整的資料庫通常還要處理:

  • 資料如何持久化
  • 使用者與權限
  • Client/Server 連線
  • Transaction
  • Catalog 與 Metadata
  • 備份與復原
  • 分散式部署

DataFusion 的核心定位比較接近一套可以嵌入其他程式的 Query Engine Library,而不是直接提供所有資料庫功能的完整產品。

它主要負責:

SQL / DataFrame
        ↓
Query Planning
        ↓
Query Optimization
        ↓
Query Execution
        ↓
Arrow RecordBatch

開發者可以在外面加入自己的儲存方式、服務介面與應用邏輯,使用 DataFusion 負責中間的查詢處理。

因此,DataFusion 可以被用來建構:

  • 分析型資料庫
  • DataFrame 函式庫
  • 串流資料平台
  • SQL 查詢工具
  • Parquet 或 CSV 分析程式
  • 特定領域的資料系統

DataFusion 核心主要在單一 Process 中執行,利用多執行緒進行平行查詢;如果需要分散式執行,也可以透過其他專案或自行建構分散式架構。


Apache Arrow 在中間扮演什麼角色?

DataFusion 使用 Apache Arrow 作為原生的記憶體資料格式。

可以先把三者的關係理解成:

Rust
└── 實作 Query Engine 的程式語言

Apache Arrow
└── 資料在記憶體中的欄式表示方式

Apache DataFusion
└── 使用 Rust 與 Arrow 建立的 Query Engine

資料從 CSV、JSON 或 Parquet 讀進來後,會被轉換成 Arrow 的欄式資料結構,再交給 DataFusion 的不同 Operator 處理。

CSV / JSON / Parquet
          ↓
    Arrow RecordBatch
          ↓
     DataFusion
          ↓
Filter / Projection / Aggregate / Join
          ↓
        Result

Arrow、Array 與 RecordBatch 會在 Day 7~10 再深入介紹。現在只要先知道,Arrow 是 Rust 與 DataFusion 能夠有效率處理欄式資料的重要基礎。


為什麼這個系列選擇 DataFusion?

市面上已經有許多成熟的資料處理工具,例如 Spark、DuckDB 或不同的資料庫系統。

選擇 DataFusion 並不是因為其他工具不好,而是因為這個系列的目標是理解 Query Engine 的內部流程。

DataFusion 適合這個目標的原因包括:

1. 它可以作為 Rust Library 使用

我們可以直接在自己的 Rust 專案加入 DataFusion,不一定要另外啟動一套資料庫服務。

2. 它的架構具有擴充性

Data Source、UDF、Optimizer Rule、Logical Plan 與 Execution Plan 都提供不同程度的擴充介面,適合觀察 Query Engine 各元件如何合作。

3. 它同時支援 SQL 與 DataFrame API

可以從熟悉的 SQL 開始,再逐步觀察 SQL 如何轉換成 Logical Plan、Physical Plan 與最後的執行結果。

4. 它能直接讀取常見的分析資料格式

CSV、JSON 與 Parquet 都會出現在這個系列中,方便我們比較不同格式進入 Query Engine 後的處理方式。

5. 它是一個持續發展的開源專案

除了閱讀文件與使用 API,也能透過 Issue、Pull Request、測試與 Code Review,實際了解一個 Query Engine 如何由開源社群共同維護。

這也是我選擇 DataFusion 的重要原因:不只是使用它,也希望能逐漸理解它、閱讀它,甚至參與改善它。


Rust × DataFusion 能讓我們學到什麼?

把 Rust 與 DataFusion 放在一起,我們不只是在學一個新的資料處理工具。

我們也會接觸:

Rust
├── 型別系統
├── Ownership
├── Error Handling
└── 非同步與並行處理

DataFusion
├── Data Source
├── Logical Plan
├── Query Optimizer
├── Physical Plan
└── Execution Engine

Apache Arrow
├── Schema
├── Array
├── RecordBatch
└── Columnar Memory Format

這三部分會共同組成接下來 30 天的主線。


今日小結

今天回答了「為什麼是 Rust × Apache DataFusion」。

Rust 提供了效能、記憶體安全與並行處理的基礎;Apache Arrow 定義了欄式資料在記憶體中的表示方式;DataFusion 則建立在兩者之上,提供 SQL、Query Planning、Optimization 與 Execution 等能力。

可以先用一句話總結:

Rust 負責安全且有效率地實作系統,Arrow 負責表示資料,DataFusion 負責規劃與執行查詢。

明天將正式進入實作:

建立第一個 Rust × DataFusion 專案,使用 SessionContext 執行第一段 SQL。


延伸閱讀


上一篇
Day 1|資料工程不只是 ETL:SQL 背後發生了什麼?
系列文
深入 SQL 查詢引擎:30 天用 Rust 與 Apache DataFusion 解構資料處理流程2
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言