淺談為什麼你該認識 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 官網閱讀官方文件。

DuckDB is a fast in-process analytical database

FOLLOW US

對抗久坐職業傷害

研究指出每天增加 2 小時坐著的時間,會增加大腸癌、心臟疾病、肺癌的風險,也造成肩頸、腰背疼痛等常見問題。

然而對抗這些問題,卻只需要工作時定期休息跟伸展身體即可!

你想輕鬆改變現狀嗎?試試看我們的 PomodoRoll 番茄鐘吧! PomodoRoll 番茄鐘會根據你所設定的專注時間,定期建議你 1 項辦公族適用的伸展運動,幫助你打敗久坐所帶來的傷害!

贊助我們的創作

看完這篇文章了嗎? 休息一下,喝杯咖啡吧!

如果你覺得 MyApollo 有讓你獲得實用的資訊,希望能看到更多的技術分享,邀請你贊助我們一杯咖啡,讓我們有更多的動力與精力繼續提供高品質的文章,感謝你的支持!