淺談為什麼你該認識 DuckDB 這類的 in-process 資料庫
談到資料庫,大家應該直覺會想到 MySQL, PostgreSQL, MongoDB 等解決方案,不過這類資料庫都需要另外架設、載入資料以及維護等步驟,另外這些資料庫都屬於外部(external)資源,也是說對於你的應用程式來說,它是一個依賴(dependency),你的應用程式需要作為 client 才能與在另 1 個 process 中運作的資料庫進行互動。
然而,不是所有的應用都適合額外架設資料庫的場景,譬如手機內常見的電話簿,如果只是為了搜尋數百筆的資料,而額外在手機內架設資料庫的話,不僅容易受限於手機有限的資源,也容易受制於資料庫的跨平台能力與可攜性,所以 SQLite 這類 in-process 的高可攜性、高跨平台能力的輕量級資料庫就相當適合做為解決方案。
而所謂的 in-process 是指資料庫不需要在另外的 process 執行,應用程式能直接在自身的 process 內運作資料庫,或稱嵌入資料庫(embedded database),所以也不需要透過 client-server 的架構進行互動、傳輸資料。
不僅應用程式開發上需要 in-process 資料庫,現代數據分析人員也產生 in-process 資料庫的需求,因爲建置、管理資料庫對數據分析人員是個成本,數據分析人員更關注如何計算、產生數據,而非先花時間建立資料庫再將資料灌進資料庫後才開始進行分析,所以才有 DuckDB 作為解決方案誕生。
DuckDB 是 in-process 的 OLAP 資料庫解決方案,數據分析人員可以用 DuckDB 載入 CSV, Parquet, Arrow 甚至是 RDBMS 上的資料,並用 SQL 語法進行數據分析。此外, DuckDB 支援 Python, R, Java, Node.js, 更支援 UDF(User Defined Function), 以及 S3, Excel, Full Text Search, Iceberg 等擴充(extensions),所以分析用途之外,也適合做 ETL(Extract, Transform, Load) 等工作。
談了這麼多,還是看程式碼最能理解, DuckDB 的 Python 程式範例如下:
import duckdb
conn = duckdb.connect()
df = conn.sql("""
SELECT *
FROM 'dataset/*.csv'
LIMIT 10
""").df()
上述重點在於 FROM 'dataset/*.csv'
這個 statement, 直接從檔案系統 dataset/
載入所有 CSV 檔,最後呼叫 .df()
轉成 Pandas 的 dataframe, 完全省去建置資料庫的步驟,而且能用 SQL 做資料過濾、匯總等步驟,比起另外學 Pandas 怎麼操作,直接使用 SQL 會更加直覺、高效!
話說回來,這類的 in-process 資料庫解決方案也並非毫無缺點,最大的缺點是 in-process 的方式十分仰賴 local 的運算資源,同時也犧牲 MySQL, MongoDB 等資料庫所具備的擴展能力(scalability),所以使用上還是端看應用場景與需求。
以上是關於 DuckDB 的簡介,有興趣的話可以進一步到 DuckDB 官網閱讀官方文件。