iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
DevOps

我獨自升級:從水管工走向 DataOps系列 第 12

【Day 12】DBT 經典案例 Jaffle Shop (1) - 環境安裝與 model 分層

  • 分享至 

  • xImage
  •  

先決條件

  1. Git
  2. Python 3.9 以上
  3. Docker Desktop or Docker Compose

如果不知道 docker 和 docker compose 的朋友,可以回到一年前的文章

  1. 吃了容器果實的鯨魚拉布-Docker(1)
  2. 吃了容器果實的鯨魚拉布-Docker(2)
  3. 用 Docker Compose 建立 Airflow 環境

示範的程式碼:Jaffle Shop Demo Repo

jaffle_shop 專案架構如下

jaffle_shop/
├── models/
│ ├── staging/
│ │ ├── schema.yml
│ │ ├── stg_customers.sql
│ │ ├── stg_orders.sql
│ │ └── stg_payments.sql
│ ├── marts/
│ │ ├── customers.sql
│ │ ├── orders.sql
│ │ └── schema.yml
├── seeds/
│ ├── raw_customers.csv
│ ├── raw_orders.csv
│ └── raw_payments.csv
├── docker-compose.yml
├── profiles.yml
└── dbt_project.yml
  • seeds/:當中會存放在載入的靜態資料,檔案格式大多是 csv ,這部分的數據修改頻率較低。
  • models/:包含 staging 和 marts 的 SQL 檔。
  • dbt_project.yml : dbt 專案的設定檔。

dbt model 分層方式

官方提供了兩個主要的層級:staging 層和 marts 層:

  • staging 層 : 主要目是數據基本的清洗、重命名和標準化,來源通常直接來自於原始數據源或是 ELT 過程中的資料倉儲(Data Warehouse, DW),例如 Google BigQuery 或是 AWS Redshift 等等。
  • marts 層 : 最終呈現數據的地方,通常與業務邏輯和報表需求相關。

題外話 - 其他層:

  1. 有些在 staging 和 marts 層之間還有 Intermediate 層,負責進行更複雜的轉換,基本上除了 marts 層以外的其他層,都不是最終報表,但也可能因數據團隊的設計邏輯,會有類似多個 marts 層的概念,讓不同負責人員將資料串到 dashboard、google sheet、excel 或是其他 BI 工具,這邊範例只是官方提供的標準模板~
  2. 有些專案會有 utilities 層來輔助其他層,通常會放通用的邏輯,例如:處理日期維度的模型、標準化字串的函數、通用分類邏輯,命名會以utils_ 開頭。

Staging 層

  • 資料表類型:通常為 view,少數情況下可以是表格 (table)。
  • 命名原則:一般會使用 stg_ 作為前綴來區分,例如 stg_users、stg_orders。
  • 轉換內容:
    • 重命名欄位(使欄位名稱一致性、可讀性更強)。
    • 基本的類型轉換(例如將日期字段轉換成標準的日期格式)。
    • 刪除重複或不必要的欄位。
    • 避免進行 JOIN、GROUP BY、聚合或多表聯結等操作,僅對原始數據進行清洗。
  • 原則:單一職責、保持原子性、不需過多邏輯轉換,提供乾淨清楚的基礎資料。

Marts

  • 資料表類型:多為 materialized_view 或 table。
  • 命名原則:彙總數據通常以 dim_ 或 fct_ 作為前綴來區分,例如 dim_customers(維度表)或 fct_sales(事實表),若是時間維度,命名會以時間為前綴,如 daily_、monthly_。
  • 轉換內容:
    • 維度表和事實表的創建。
    • 聚合和計算業務指標(例如銷售額、客戶數量、轉化率等),包含 GROUP BY、SUM()、COUNT() 等複雜查詢邏輯。
    • 基於不同業務需求,實現更加複雜的轉換和計算邏輯。
    • 維度表用來存儲相對靜態的信息(例如 dim_customers),而事實表用來存儲變化頻繁的數據(例如 fact_sales)。
  • 原則:因這層會對到使用者,要更多考慮效能和權限區分,通常會再去定義不同使用者有權存取的欄位來設計最終的表。

專案環境設置

1. 從 github 上 Clone 專案

git clone https://github.com/snhou/jaffle-shop-dbt-demo.git

2. 進入 jaffle_shop 專案目錄

cd jaffle-shop-dbt-demo

3. 建立虛擬環境

python3 -m venv dbt-venv

4. 進入虛擬環境

source venv/bin/activate

5. 更新 pip

python3 -m pip install - upgrade pip

應該有發現 STEP1~5 昨天都有做過了~

6. 安裝需要的套件

python3 -m pip install -r requirements.txt
  • 其實就是兩個 dbt-core==1.8.3dbt-postgres==1.8.2,昨天示範的只有 dbt-core 和 init 完的基礎介紹,正常都會依照不同 database 安裝對應的 adapters
  • 完整的 adapters 列表

6. 執行 docker-compose.yaml

  • 如果是 Docker Desktop 版本記得要先開啟

(1) 先將 image build 起來

docker-compose build

(2) 再啟動 container

docker-compose up -d

小結

container 啟動都沒問題的話,明天就會開始 dbt seeddbt rundbt debug,並說明用途和細節,也會針對 docker-compose.yml 說明/images/emoticon/emoticon12.gif


上一篇
【Day 11】DBT 新手村入門:環境設定介紹
下一篇
【Day 13】DBT 經典案例 Jaffle Shop (2) - 轉換步驟指南
系列文
我獨自升級:從水管工走向 DataOps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言