從昨天的 jaffle 專案環境建置中,應該可以發現整個專案是在 venv 虛擬環境中運行,但 postgres 卻是在 docker 當中,主要是根據原來官方提供的 jaffle shop,盡可能做最小的改動以順利運行即可。
其實我和官方的差異只是開一個 db,整體流程都一樣,就是將 seeds 資料導入,經過 dbt 的資料轉換(transform),產出需要的 view 和 table,轉換過程 staging 和 marts 層都是在等等開的 postgresql 當中,就讓我們接著下去吧~
要將所有環境都開在 docker 當然也是沒問題的~
docker-compose.yaml
說明version: "3.9"
services:
postgres:
image: postgres:13
environment:
POSTGRES_USER: dbt
POSTGRES_PASSWORD: dbt
POSTGRES_DB: dbt
volumes:
- postgres-db-volume:/var/lib/postgresql/dbt_data
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 5s
timeout: 5s
retries: 5
volumes:
postgres-db-volume:
interval:5s
:每 5 秒檢查一次 PostgreSQL 的健康狀態。timeout:5s
:每次健康檢查的超時時間設為 5 秒。如果 PostgreSQL 在 5 秒內沒有回應,則視為健康檢查失敗。retries:5
:如果健康檢查連續失敗 5 次,則判斷 PostgreSQL 服務不健康。可以從
docker ps
看到status
欄位是 healthy
目的是檢查 dbt 的連接配置、資料庫連接、憑證、資料源等是否設置正確。
dbt debug
從圖片可以確認 configuration 和 Connection 都沒問題!
將本地的 CSV 文件上傳到資料庫,作為靜態資料來源。這些文件稱為 "seed" 資料,用來在模型中參考。
dbt seed
我通常實務上比較少用,通常是 local 測試或是針對沒有測試環境 DB 的情況下才會用
dbt seed
載入資料
將包含 Jinja 模板語法的 dbt 模型編譯成 SQL 查詢且不執行,有助於檢查 SQL 的正確性。
dbt compile
執行完 compile 後,也可以直接在
target/
資料夾中,找到compiled/
資料夾,在其中查看編譯過後的 SQL 檔案
在運行模型或更新資料庫時,執行 dbt run
,實際執行 SQL 轉換,並將轉換後的結果寫入資料庫。
dbt run
可以在 model 當中的 schema.yml 中查看 test 設定的細節,以下方 stg_orders
為例,針對 order_id
欄位檢查 unique
和 not_null
,針對 status
欄位檢查值是否都是 values 列表當中的這五種。
- name: stg_orders
columns:
- name: order_id
tests:
- unique
- not_null
- name: status
tests:
- accepted_values:
values: ['placed', 'shipped', 'completed', 'return_pending', 'returned']
dbt test
可以生成資料庫表和模型的文件,幫助你或團隊理解的資料流程,生成後的文件和關聯圖,可以通過 dbt docs serve
來查看。
通常會稱為 dbt lineage,lineage 是家系、沿襲的意思,就是透過這個圖可以知道資料上下游關係,其中類型也是 airflow 有提到的 DAGs (directed acyclic graphs,有向無環圖),就是單一方向的節點連結
dbt docs generate
直接執行就會開在 localhost 的 8080 port,在正式開發通常會另外用一個靜態服務的網站,後續方便查看和追蹤目前運行中的 dbt 流程內容,也能確認資料欄位和細節。
dbt docs serve
http://localhost:8080/#!/overview
target/
,刪除生成的文件和資料,通常是重新執行前會需要清除舊的紀錄。明天還會再說明一下 jaffle shop 轉換後的資料,和如何查找 postgresql 資料,後天就會開始將 airflow 搭配 dbt 使用啦~