iT邦幫忙

2023 iThome 鐵人賽

DAY 16
1

DuckDB 是一種 OLAP 專用的嵌入式資料庫 (embedded database),某種程度來講,它就像是 SQLite 的 OLAP 版本。註:SQLite 是一種 OLTP 專用的嵌入式資料庫。

我曾經以為,聽完上述的說明之後,『多數人』就可以快速地掌握到 DuckDB 大概是什麼,並且立刻猜出,用 DuckDB 的話,就不用設定權限管理、帳號密碼,超方便。後來,我才發現,我以為的『多數人』只是用過 SQLite 的多數人。(笑~)

沒有使用過 SQLite 、對於嵌入式資料庫的概念不熟的讀者,在這邊不妨考慮用極簡的方式來理解 DuckDB 與使用它的理由。

  1. 設罝簡易:DuckDB 的設置 (configuration) 相比於一般的資料庫,簡單的多,比方說:使用者、密碼、權限等都不需要設定。
  2. 使用方式直覺:如果操作 SQL 時,就是在本地端使用 SQL IDE 或是 CLI (command line interface) 的話,DuckDB 用起來的感覺,幾乎就跟其它的資料庫一模一樣了。
  3. 效能卓越:DuckDB 運作的速度超快。如果你的總資料量在 1T 以下,幾乎沒有懸念,用 DuckDB 絕對跑得動,不需要使用雲端資料庫。這部分值得特別補充一下,DuckDB 的實作,率先應用了許多本來還只是在學術界的資料庫理論,也因此,它在效能上有了長足的改進。

DuckDB CLI 的安裝

  1. 參考 DuckDB 官網的安裝方式
  2. 如果電腦是 Mac 的話,執行 brew install duckdb

DuckDB CLI 的使用

  • 如果要透過 CLI 來使用 DuckDB 時,開啟 terminal 介面,下指令 duckdb $local_db_filename,就可以開始對資料庫做讀寫了。

註:

  • duckdb 是 DuckDB CLI 的指令名稱。
  • $local_db_filename 是你指定的檔名。日後,duckdb 就會以此檔案來儲存所有的資料庫裡的資料。

DuckDB CLI 的特殊指令 (special commands)

特殊指令只能透過 DuckDB CLI 來使用,它是用來讓 DuckDB CLI 更好用而設計的。

  • .columns 以 Column-wise 的方式來顯示查詢結果
  • .rows 以 Row-wise 的方式來顯示查詢結果
  • .read [SQL_CMD_FILE] SQL 指令寫在 [SQL_CMD_FILE] 檔案裡,讀入後執行
  • .exit 離開 DuckDB 的 CLI

DuckDB 的後設函數、後設查詢

要使用資料庫,除了使用標準的 SQL 查詢之外,我們也需要一些輔助指令,以取得與資料庫本身狀態相關的資訊。

DuckDB 會把上述這種「資料庫本身狀態相關的資訊」,以資料庫後設函數的形式,讓使用者可以查詢。使用者要查後設函數的輸出時,可以把函數名稱當作 table 來查。比方說:

  • select * from duckdb_tables; 顯示有哪些表 (tables)
  • select * from duckdb_views; 顯示有哪些視圖 (views)
  • select * from duckdb_schemas; 顯示有哪些命名空間 (schema)
  • select * from duckdb_databases 顯示有哪些資料庫 (database)

除了後設函數之外,DuckDB 的後設查詢 (meta queries),也相當有用:

  • SHOW TABLES 顯示本命名空間 (schema) 內,所有可以查詢的表 (table) 與視圖 (view)
  • SHOW ALL TABLES 顯示現在已連接資料庫 (database) 與命名空間 (schema) 之內,所有可以查詢的表 (table) 與視圖 (view)
  • DESCRIBE [TABLE] 顯示 TABLE 的定義

還有一些重要的指令,它是一般 SQL 語句,非後設查詢,卻也對我們了解資料庫的狀態極為重要:

  • USE [DATABASE_NAME].[SCHEMA_NAME] 切換資料庫、或是同時切換資料庫與命名空間。參考資料
  • SELECT current_schema(); 顯示正在使用中的命名空間 (schema) 。參考資料

透過 Dbeaver 來使用 DuckDB

讀者可能覺得,什麼事都硬要使用 terminal 還是太過頭了,有點太過於 1337 h4x0r 。DuckDB 也可以透過 DBeaver 來使用。

在 Metabase 安裝 DuckDB 轉接器

Metabase 有一點與 dbt 相似,它也可以連接多種的資料倉儲,而且是使用轉接器來連接。目前 Metabase 如果要連接 DuckDB 的話,必須手動安裝DuckDB 的轉接器 (driver)。參考這裡的安裝方法

安裝方式:

  1. 假設,你啟動 Metabase 時,是在 app 這個資料夾下,下指令:java -jar metabase-v-0.xxx.jar
  2. 產生一個新資料夾,叫 app/plugins
  3. 這邊找合適的版本,下載 DuckDB 轉接器。
  4. 將下載好的 DuckDB 轉接器移動到 app/plugins,這樣子就完成安裝了。

總結

到這邊為止,現代資料棧 (modern data stack) 應該在你的電腦已經安裝好大部分了,只差 EL tools 了:

  1. View layer: Metabase
  2. Transformation layer: dbt + SQL
  3. Data warehouse: DuckDB

在實務上的應用,有時候,我們也未必一定要使用專業的 EL tools 才能把資料灌入資料倉儲裡,比方說,許多的資料庫也都提供可以直接匯入外部的 csv 檔的指令。換言之,用低一點的標準來看,現代資料棧已經在你的電腦灌好囉!

關於 DuckDB 的一些小提醒

  • 由於 DuckDB 在我寫這篇文章的時候,還尚未扺達 version 1.0,且根據 DuckDB 的說法:"The storage of DuckDB is not yet stable; newer versions of DuckDB cannot read old database files and vice versa. The storage will be stabilized when version 1.0 releases."
  • 綜合上述,如果你要使用的現代資料棧並不只是用於學習、個人專案之用,而是用於公司的生產環境,請至少先等 DuckDB 過了 1.0 版才考慮囉!

其它資源

  1. 對 dbt 或 data 有興趣 👋?歡迎加入 dbt community 到 #local-taipei 找我們,也有實體 Meetup 請到 dbt Taipei Meetup 報名參加
  2. 歡迎訂閱 PruningSuccess 電子報,主要談論軟體開發、資料處理、資料分析等議題。

上一篇
Tranformation layer: dbt 安裝
下一篇
Transformation layer: dbt 基本操作
系列文
當代資料工程與資料分析30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言