dbt 允許開發者在版本控制下管理 SQL 查詢、少量非揮發性資料,以及自動生成檔案。這對於提升資料轉換效率至關重要,尤其在複雜的資料倉儲專案中,更能體現其價值。透過 dbt,我們可以將資料轉換邏輯模組化,並利用 Jinja 範本簡化程式碼,提高程式碼的可讀性和可維護性。
dbt 專案結構解析:分析、種子資料與檔案
dbt(Data Build Tool)是一個強大的資料轉換工具,廣泛應用於資料倉儲和商業智慧領域。瞭解 dbt 專案結構對於有效管理和開發資料轉換流程至關重要。本文將探討 dbt 專案中的三個重要組成部分:分析(Analyses)、種子資料(Seeds)以及檔案(Documentation)。
分析(Analyses)
分析目錄用於存放臨時查詢、稽核查詢、訓練查詢或重構查詢。這些查詢無法在 dbt run 期間執行,但可以使用 Jinja 範本語法,並透過 dbt compile 檢視編譯後的結果。這使得開發者能夠在版本控制下管理查詢程式碼。
使用案例:分析最有價值的客戶
假設我們想找出在訂單完成狀態下,總支付金額最高的 10 位客戶。首先,在 analyses 目錄下建立一個名為 most_valuable_customers.sql 的檔案,並將以下程式碼複製到其中:
with fct_orders as (
select * from {{ ref('fct_orders') }}
),
dim_customers as (
select * from {{ ref('dim_customers') }}
)
select
cust.customer_id,
cust.first_name,
SUM(total_amount) as global_paid_amount
from fct_orders as ord
left join dim_customers as cust ON ord.customer_id = cust.customer_id
where ord.is_order_completed = 1
group by cust.customer_id, first_name
order by 3 desc
limit 10
內容解密:
- 使用 CTE(Common Table Expressions)
fct_orders和dim_customers分別參照fct_orders和dim_customers模型。 - 對已完成的訂單進行客戶 ID 和名字與總支付金額的匯總。
- 根據總支付金額進行降序排序,並限制結果為前 10 名。
執行此查詢後,我們可以獲得最有價值的客戶列表,如圖所示。
種子資料(Seeds)
種子資料是 dbt 專案中的 CSV 檔案,用於儲存少量非揮發性資料,並將其物化為資料平台中的表格。透過執行 dbt seed 命令,種子資料可以像其他模型一樣在專案中使用。
使用案例:客戶分類別
假設我們想根據客戶的總支付金額對其進行分類別。首先,在 seeds 目錄下建立一個名為 customer_range_per_paid_amount.csv 的檔案,並填入以下資料:
min_range,max_range,classification
0,9.999,Regular
10,29.999,Bronze
30,49.999,Silver
50,9999999,Gold
然後,執行 dbt seed 將 CSV 檔案物化為表格。接著,在 analyses 目錄下建立一個新的 SQL 檔案,用於根據總支付金額對客戶進行分類別:
with fct_orders as (
select * from {{ ref('fct_orders') }}
),
dim_customers as (
select * from {{ ref('dim_customers') }}
),
total_amount_per_customer_on_orders_complete as (
select
cust.customer_id,
cust.first_name,
SUM(total_amount) as global_paid_amount
from fct_orders as ord
left join dim_customers as cust ON ord.customer_id = cust.customer_id
where ord.is_order_completed = 1
group by cust.customer_id, first_name
),
customer_range_per_paid_amount as (
select * from {{ ref('seed_customer_range_per_paid_amount') }}
)
select
tac.customer_id,
tac.first_name,
tac.global_paid_amount,
crp.classification
from total_amount_per_customer_on_orders_complete as tac
left join customer_range_per_paid_amount as crp
on tac.global_paid_amount >= crp.min_range
and tac.global_paid_amount <= crp.max_range
內容解密:
- 使用多個 CTE 進行資料準備和轉換。
- 將客戶的總支付金額與種子資料中的範圍進行匹配,以確定客戶的分類別。
- 輸出客戶 ID、名字、總支付金額和對應的分類別。
檔案(Documentation)
檔案是軟體開發中的重要環節,但在實際操作中往往被忽視或延遲。良好的檔案可以提高團隊協作效率,降低維護成本。dbt 提供了檔案生成功能,可以根據模型和欄位自動生成相關檔案。
圖表翻譯:
本文中提到的圖表展示了根據客戶總支付金額進行分類別的結果。圖表清晰地呈現了不同分類別下的客戶分佈情況,有助於業務人員和分析師更好地理解客戶價值。
dbt 檔案生成與使用
在軟體開發和資料分析領域中,檔案編寫常常被視為非必要的任務,理由包括「我們不會這樣做」、「現在不是時候」或「我們沒有時間」。然而,建立和使用檔案具有多項重要理由:
為什麼需要檔案?
- 促進新人培訓和知識傳承:完善的檔案可以幫助新成員快速瞭解團隊流程、概念、標準和技術發展,降低學習曲線。
- 提供單一真相來源:檔案可以包含業務定義、流程和操作,讓使用者自行查詢相關資訊,節省團隊時間和精力。
- 減少重複工作:透過分享知識,檔案可以減少重複或冗餘的工作。
- 促進共同責任感:檔案確保關鍵知識不侷限於單一人員,防止因關鍵人員不可用而導致的中斷。
- 建立品質和流程控制:檔案有助於實作公司內部的凝聚力和一致性,滿足合規要求。
dbt 中的檔案生成
與傳統開發流程不同,dbt 允許在開發分析程式碼、測試和連線資料來源的過程中同步建立專案檔案。這意味著檔案生成不再是獨立的流程,而是整合在 dbt 中的一部分。
檔案結構
首先,建立一個名為 _core_models.yml 的 YAML 檔案,用於描述模型及其欄位。範例如下:
version: 2
models:
- name: fct_orders
description: 分析訂單資料。
columns:
- name: order_id
description: 訂單的主鍵。
- name: customer_id
description: 對應到 dim_customers 的客戶 ID。
- name: order_date
description: 客戶下單的日期。
- name: cash_amount
description: 客戶以「成功」支付狀態下以現金支付的總金額。
- name: credit_amount
description: 客戶以「成功」支付狀態下以信用卡支付的總金額。
- name: total_amount
description: 客戶以「成功」支付狀態下支付的總金額。
- name: is_order_completed
description: "{{ doc('is_order_completed_docblock') }}"
- name: dim_customers
description: 客戶資料,用於分析與客戶相關的事實。
columns:
- name: customer_id
description: 客戶的主鍵。
- name: first_name
description: 客戶的名字。
- name: last_name
description: 客戶的姓氏。
使用 Markdown 檔案進行詳細說明
接著,建立一個名為 _code_docs.md 的 Markdown 檔案,用於新增詳細的檔案區塊。範例如下:
{% docs is_order_completed_docblock %}
表示訂單是否完成的二進位制資料,取決於訂單狀態。它可能包含以下值:
| is_order_completed | 定義 |
|
---
-
---
-
---
-
---
-
---
-|
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
-
---
|
| 0 | 根據訂單狀態,尚未完成的訂單 |
| 1 | 根據訂單狀態,已經完成的訂單 |
{% enddocs %}
生成檔案
在命令列中輸入 dbt docs generate 以生成檔案。成功後,可以在 IDE 中點選檔案圖示來檢視檔案頁面。
檢視檔案頁面
生成檔案後,可以透過點選 IDE 左上角的檔案圖示來存取檔案頁面。預設情況下,dbt 提供了一個概覽頁面,但這個頁面是可自定義的。
瀏覽模型檔案
在檔案頁面中,可以看到專案結構,並自由導航到不同的模型、測試和種子資料。選擇一個模型(例如 fct_orders),即可檢視其詳細檔案,包括欄位描述和其他相關資訊。
內容解密:
- YAML 檔案的作用:YAML 檔案用於描述模型及其欄位,提供詳細的 metadata,有助於生成自動化的檔案。
- Markdown 檔案的使用:Markdown 檔案用於新增更豐富的說明,例如對特定欄位或邏輯的詳細解釋,可以包含表格、列表等格式。
- 生成檔案的步驟:透過在命令列中執行
dbt docs generate命令,可以根據 YAML 和 Markdown 檔案生成完整的專案檔案。 - 檔案的視覺化呈現:dbt 提供了一個視覺化的檔案頁面,可以清晰地展示專案的結構、模型的描述、欄位的定義等資訊。
圖表翻譯:
此圖示展示了dbt檔案的整體結構與呈現方式,包括專案結構、模型描述和欄位定義等內容,能夠清晰地幫助開發者理解和使用專案中的各項資源。
dbt 檔案頁面功能詳解
總覽頁面
首次進入 dbt 檔案頁面時,您會看到一個總覽頁面,類別似於圖 4-47。這個頁面預設提供了 dbt 的基本資訊,但它也是完全可自定義的。
專案結構導航
在總覽頁面的左側,您可以看到專案結構(圖 4-48),其中包括測試、種子資料和模型等。您可以自由導航到不同的部分,以檢視相關的檔案。
模型檔案詳情
選擇一個已開發的模型,例如 fct_orders,即可檢視其詳細檔案。點選該模型的檔案後,螢幕將顯示多層次的資訊(圖 4-49),包括模型的描述、欄位的定義以及其他相關資訊。
內容解密:
- 總覽頁面的自定義:總覽頁面提供了專案的基本資訊,但您可以根據需要進行自定義,以更好地滿足團隊的需求。
- 專案結構導航功能:左側的專案結構導航欄使您可以快速存取不同的模型、測試和種子資料,提高了檔案的可讀性和可存取性。
- 模型檔案的詳細資訊:透過點選特定的模型,您可以檢視其詳細描述,包括欄位定義、測試和其他相關資訊,有助於深入瞭解模型的設計和使用方法。
圖表翻譯:
此圖示展示了dbt檔案中專案結構的導航方式以及模型檔案的詳細內容,能夠幫助開發者更好地理解專案的組織結構和模型的具體實作。
dbt 檔案與命令詳解
dbt(Data Build Tool)是一個強大的資料轉換工具,它提供了豐富的檔案功能和命令列介面,以幫助資料團隊更有效地管理和轉換資料。本文將探討dbt的檔案結構和命令列操作。
dbt 檔案結構
dbt的檔案頁面提供了豐富的資訊,包括表的中繼資料、模型描述、欄位資訊等。這些資訊對於瞭解資料的結構和用途至關重要。
表的中繼資料
在檔案的頂部,您可以找到表的詳細資訊,例如表型別(也稱為物化方式)、使用的語言、行數和近似的表大小。這些資訊對於瞭解表的特性和使用情況非常有幫助。
模型描述
緊接著中繼資料的是模型的描述,這是在 _core_models.yml 檔案中為 fct_orders 表組態的。這個描述提供了對模型的全面瞭解,有助於團隊成員之間的溝通和協作。
欄位資訊
欄位資訊部分提供了 fct_orders 表的欄位詳情,包括欄位型別和描述。這些資訊部分是自動生成的,部分則需要手動輸入。例如,is_order_completed 屬性的描述是透過 doc block 提供的。當您點選 is_order_completed 欄位時,會展開並顯示相關的描述資訊。
上下游依賴關係
在欄位資訊之後,您可以看到模型的上下游依賴關係,分別是「Referenced By」和「Depends On」部分。這些依賴關係對於瞭解資料的流動和模型的相互關係非常重要。
原始碼與血統圖
在檔案的底部,您可以找到生成該模型的原始碼。您可以檢視原始碼的純文字格式、使用 Jinja 的格式或編譯後的程式碼。此外,在頁面的右下角有一個藍色的按鈕,點選後可以存取該模型的血統圖。血統圖提供了資料從源頭到最終呈現的整個流程的視覺化檢視,非常有助於理解資料的流動和轉換過程。
dbt 命令列操作
dbt 提供了一系列命令列工具,用於執行和管理資料轉換工作流程。以下是一些常用的 dbt 命令:
dbt run
dbt run 命令用於執行資料轉換操作。它根據專案的組態檔案(如 dbt_project.yml)來確定需要執行的模型及其執行順序。
dbt test
dbt test 命令用於定義和執行對資料模型的測試,以確保資料品質和可靠性。
dbt docs
dbt docs 命令用於自動生成專案的檔案,包括模型描述、欄位描述和模型之間的關係。要生成檔案,需要執行 dbt docs generate 命令。
dbt build
在執行 dbt 專案之前,通常需要進行編譯。dbt build 命令執行此任務,建立執行所需的工件,以最佳化執行過程並確保一切就緒。
其他實用命令
除了上述基本命令外,dbt 還提供了其他一些實用的命令,例如:
dbt seed:將原始資料或參考資料載入到專案中。dbt clean:刪除由dbt build生成的工件。dbt snapshot:對資料進行快照以進行版本控制。dbt archive:將表或模型存檔到冷儲存中。dbt deps:安裝在packages.yml中定義的專案依賴項。dbt run-operation:執行在專案中定義的自定義操作。dbt source snapshot-freshness:檢查源資料的新鮮度。dbt ls:列出 dbt 專案中定義的資源。dbt retry:從失敗點重新執行最後一次執行的 dbt 命令。dbt debug:以除錯模式執行 dbt,提供詳細的除錯資訊。dbt parse:解析 dbt 模型而不執行它們,用於語法檢查。dbt clone:從指定的狀態克隆選定的模型。
掌握這些命令和檔案功能,可以幫助您更有效地管理和轉換資料,提高工作效率和資料品質。
dbt 專案結構與佈署
dbt(Data Build Tool)是一個強大的資料轉換工具,廣泛應用於資料工程領域。本文將探討dbt專案的結構、選擇語法以及佈署流程,幫助讀者更好地理解和運用dbt進行資料轉換工作。
dbt 專案初始化
首先,使用 dbt init 命令可以在當前目錄中建立一個新的dbt專案。這是開始使用dbt的第一步。
選擇語法(Selection Syntax)
隨著dbt專案的增長,需要針對特定的模型、測試或其他資源執行命令,而不是每次都執行所有內容。這時就需要使用選擇語法。選擇語法允許精確指定要包含或排除的資源。
萬用字元(Wildcard)
使用星號(*)代表任意字元或字元序列。例如:
dbt run --select models/marts/core/*
這個命令會執行 core 目錄下的所有模型、測試或其他資源。
標籤(Tags)
可以為模型、巨集或其他資源分配標籤,然後使用選擇語法根據標籤進行篩選。例如:
dbt run --select tag:marketing
這個命令會執行所有帶有 marketing 標籤的資源。
模型名稱
可以直接使用模型名稱來選擇特定的模型。例如:
dbt run --select fct_orders
這個命令會執行名為 fct_orders 的模型。
相依性(Dependencies)
使用 + 和 - 符號可以選擇依賴於其他模型的模型,或被其他模型依賴的模型。例如:
# 執行 fct_orders 的上游依賴模型
dbt run --select +fct_orders
# 執行 fct_orders 的下游依賴模型
dbt run --select fct_orders+
# 執行 fct_orders 的上下游依賴模型
dbt run --select +fct_orders+
套件(Packages)
如果將dbt專案組織成套件,可以使用套件語法選擇特定套件中的資源。例如:
dbt run --select my_package.some_model
多重選擇
可以結合多種選擇語法的元素來建立複雜的選擇條件。例如:
dbt run --select tag:marketing fct_orders
這個命令會執行名為 fct_orders 且帶有 marketing 標籤的模型。
工作與佈署(Jobs and Deployment)
在開發環境中完成dbt專案的開發後,需要將程式碼佈署到生產環境並自動化執行。以下是佈署流程:
- 提交並同步程式碼:將開發分支的程式碼提交並同步到遠端倉函式庫。
- 建立 Pull Request:建立 Pull Request 以審查程式碼變更。
- 合併程式碼:將程式碼合併到主分支。
- 設定佈署環境:在 dbt Cloud 中設定佈署環境,組態相關引數。
- 建立作業:建立作業以自動化執行 dbt 命令。
佈署環境設定
- 從 Deploy 選單中選擇 Environments 選項,然後點選 Create Environment 按鈕。
- 組態佈署環境的相關引數,例如 dbt 版本、佈署憑據等。
佈署流程
@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle
title dbt 專案結構解析與佈署
package "SQL 資料庫架構" {
package "資料定義 DDL" {
component [CREATE] as create
component [ALTER] as alter
component [DROP] as drop
}
package "資料操作 DML" {
component [SELECT] as select
component [INSERT] as insert
component [UPDATE] as update
component [DELETE] as delete
}
package "進階查詢" {
component [JOIN 連接] as join
component [GROUP BY 分組] as group
component [子查詢] as subquery
component [窗口函數] as window
}
database [資料表] as table
}
create --> table : 建立結構
select --> join : 多表查詢
join --> group : 聚合統計
group --> window : 分析函數
insert --> table : 新增資料
update --> table : 修改資料
delete --> table : 刪除資料
note right of join
INNER JOIN 交集
LEFT JOIN 左表全部
RIGHT JOIN 右表全部
end note
@enduml圖表翻譯: 此圖示展示了從開發完成到自動化執行的整個佈署流程。首先開發人員完成開發後提交並同步程式碼,接著建立 Pull Request 進行程式碼審查。審查透過後將程式碼合併到主分支,然後設定佈署環境並建立作業,最終實作自動化執行 dbt 命令。