Apache Arrow DataFusion 16.0.0 專案更新
已發布 2023年1月19日
作者 Apache Arrow PMC (pmc)
簡介
DataFusion 是一個可擴展的查詢執行框架,以 Rust 語言編寫,並使用 Apache Arrow 作為其記憶體內格式。它主要針對創建資料密集型分析的開發人員,並提供成熟的 SQL 支援、DataFrame API 和許多擴展點。
基於 DataFusion 的系統在基準測試中表現非常出色,尤其考慮到它們直接在 Parquet 檔案上操作,而不是先載入到專用格式中。最近的一些亮點包括 clickbench 和 Cloudfuse.io 獨立查詢引擎 頁面。
DataFusion 也是長期趨勢的一部分,Andy Pavlo 在他的 2022 年資料庫回顧 中清楚地闡述了這一點。資料庫框架正在迅速普及,所有 OLAP DBMS 和其他資料密集型應用程式(例如機器學習)很可能在未來 5 年內需要向量化、高效能的查詢引擎才能保持相關性。在沒有數百萬美元投資的情況下,使此類技術如此廣泛可用的唯一實際方法是透過 DataFusion 或 Velox 等開源引擎。
本文的其餘部分介紹了 DataFusion 在過去三個月中所做的改進,以及對未來發展方向的一些提示。
社群成長
自 上次更新 以來,我們再次看到 DataFusion 社群的顯著成長。在 OSSRank 上有一些有趣的指標。
DataFusion 16.0.0 版本包含來自 73 位不同貢獻者的 543 個 PR,這還不包括所有投入到相依性(例如 arrow、parquet 和 object_store)的工作,而大部分相同社群也協助支援這些相依性。感謝大家的所有幫助!
最近新增了幾個 基於 DataFusion 的新系統
效能 🚀
效能和效率是 DataFusion 的核心價值。雖然 DataFusion 與同類最佳、緊密集成的系統(例如 DuckDB 和 Polars)之間仍然存在差距,但 DataFusion 正在快速縮小差距。以下是過去三個月的效能亮點:
- 使用新的 Row Format,排序和合併速度提升高達 30%
- 進階的述詞下推,直接在 Parquet 上,直接從物件儲存中,實現亞毫秒級的篩選。
70%
更快的IN
運算式評估 (#4057)- 感知排序和分割的最佳化 (#3969 和 #4691)
- 篩選器選擇性分析 (#3868)
執行階段資源限制
先前,DataFusion 可能會針對某些包含排序、分組或聯結的查詢使用無限制的記憶體量。
在 16.0.0 版本中,可以限制 DataFusion 用於排序和分組的記憶體使用量。我們正在尋求協助,為聯結添加類似的限制,並擴展我們的演算法以選擇性地溢出到輔助儲存。請參閱 #3941 以取得更多詳細資訊。
SQL 視窗函數
SQL 視窗函數 對於各種分析都很有用,而 DataFusion 的實作支援已顯著擴展
- 自訂視窗框架,例如
... OVER (ORDER BY ... RANGE BETWEEN 0.2 PRECEDING AND 0.2 FOLLOWING)
- 無界視窗框架,例如
... OVER (ORDER BY ... RANGE UNBOUNDED ROWS PRECEDING)
- 支援
NTILE
視窗函數 (#4676) - 支援
GROUPS
模式 (#4155)
改進的聯結
聯結通常是在分析系統中難以妥善處理的最複雜操作,而 DataFusion 16.0.0 提供了顯著的改進,例如
- 基於成本的最佳化器 (CBO) 自動重新排序聯結評估,根據可用的統計資料和聯結類型(
INNER
、LEFT
等)選擇演算法(合併/雜湊)並選擇建置端 (#4219) - 快速的非
column=column
等值聯結,例如JOIN ON a.x + 5 = b.y
- 非等值聯結的效能提升 (#4562)
串流執行
DataFusion 的一個新興用例是作為串流優先資料平台的基礎。一個重要的先決條件是支援可增量計算的查詢的增量執行。
在此版本中,DataFusion 現在支援以下串流功能
- 從無限檔案(例如 FIFO)攝取資料 (#4694),
- 在串流用例中偵測破壞管線的查詢 (#4694),
- 自動交換聯結的輸入,使探測端成為資料串流 (#4694),
- 盡可能智慧地省略破壞管線的排序操作 (#4691),
- 更多類型查詢的增量執行;例如,涉及有限視窗框架的查詢 (#4777)。
這些是向前邁出的重要一步,我們計劃在接下來的幾個版本中進行更多改進。
更好地支援分散式目錄
16.0.0 增強了對非同步目錄的支援 (#4607),以更好地支援分散式中繼資料儲存,例如 Delta.io 和 Apache Iceberg,它們在規劃期間需要非同步 I/O 才能存取遠端目錄。先前,DataFusion 需要同步存取所有相關的目錄資訊。
額外的 SQL 支援
SQL 支援持續改進,包括以下一些重點
- 新增 TPC-DS 查詢規劃回歸測試 #4719
- 支援
PREPARE
陳述式 #4490 - 日期和時間戳記之間的自動強制轉換 #4726
- 支援時間戳記和 utf8 的類型強制轉換 #4312
- 完全支援 time32 和 time64 常值 (
ScalarValue
) #4156 - 新函數,包括
uuid()
#4041、current_time
#4054、current_date
#4022 - 壓縮的 CSV/JSON 支援 #3642
社群也投入了新的 基於 sqllogic 的 測試,以更輕鬆地持續改進 DataFusion 的品質。
計劃序列化和 Substrait
DataFusion 現在支援物理計劃的序列化,使用自訂的 Protocol Buffers 格式。此外,我們正在新增對 Substrait 的初步支援,Substrait 是一種用於關係代數的跨語言序列化。
如何參與
感謝社群中每位貢獻想法、討論、錯誤報告、文件和程式碼的人。能夠一起建立如此酷的東西真是令人興奮!
如果您有興趣貢獻 DataFusion,我們非常歡迎您加入我們。您可以嘗試在您自己的資料和專案上使用 DataFusion,並告訴我們進展如何,或者貢獻包含文件、測試或程式碼的 PR。適合初學者的開放 issue 清單 在此。
請查看我們的 溝通文件,以了解更多與社群互動的方式。
附錄:貢獻者致謝
以下是在過去三個版本中為此專案貢獻 PR 的人員清單,來源於 git shortlog -sn 13.0.0..16.0.0 .
感謝大家!
113 Andrew Lamb
58 jakevin
46 Raphael Taylor-Davies
30 Andy Grove
19 Batuhan Taskaya
19 Remzi Yang
17 ygf11
16 Burak
16 Jeffrey
16 Marco Neumann
14 Kun Liu
12 Yang Jiang
10 mingmwang
9 Daniël Heres
9 Mustafa akur
9 comphead
9 mvanschellebeeck
9 xudong.w
7 dependabot[bot]
7 yahoNanJing
6 Brent Gardner
5 AssHero
4 Jiayu Liu
4 Wei-Ting Kuo
4 askoa
3 André Calado Coroado
3 Jie Han
3 Jon Mease
3 Metehan Yıldırım
3 Nga Tran
3 Ruihang Xia
3 baishen
2 Berkay Şahin
2 Dan Harris
2 Dongyan Zhou
2 Eduard Karacharov
2 Kikkon
2 Liang-Chi Hsieh
2 Marko Milenković
2 Martin Grigorov
2 Roman Nozdrin
2 Tim Van Wassenhove
2 r.4ntix
2 unconsolable
2 unvalley
1 Ajaya Agrawal
1 Alexander Spies
1 ArkashaJavelin
1 Artjoms Iskovs
1 BoredPerson
1 Christian Salvati
1 Creampanda
1 Data Psycho
1 Francis Du
1 Francis Le Roy
1 LFC
1 Marko Grujic
1 Matt Willian
1 Matthijs Brobbel
1 Max Burke
1 Mehmet Ozan Kabak
1 Rito Takeuchi
1 Roman Zeyde
1 Vrishabh
1 Zhang Li
1 ZuoTiJia
1 byteink
1 cfraz89
1 nbr
1 xxchan
1 yujie.zhang
1 zembunia
1 哇呜哇呜呀咦耶