在 dbt 幫我們先建立好的兩個模型中,可以看出來在 dbt 裡面的 SQL Script 以 select
敘述句為主,就跟我們平常使用 LookerStudio,Tableau 或是 Power BI 時,可以先用 Select
Query 做一次資料轉換一樣,因此我們會說 dbt 是一個很適合資料分析師上手的工具,但同時這也代表,利用 dbt 完成的資料管線,需要先有人幫我們把資料複製一份到資料倉儲中。簡單說,使用 dbt 前,必須確保資料庫中是有資料的
舉例來說,工程師已經幫我把資料匯入資料倉儲或是資料中台裡面了,如下圖,我的資料倉儲中已經有 crm 系統的公司這張表,以及 訂單系統的庫戶這張表。
現在我們必須設定 dbt 的 source.yml 檔案,讓 dbt 知道有這些資料源:
以 Postgres 來說,所以資料都會統一放在同一個 database 裡面,只是不同系統可能會放進不同的 schema。我的專案是兩個系統的資料都放在名為 postgres
的資料庫中,不同系統的資料分別放在 crm
以及 order_system
這兩張 schema。 name 的部分也是以 schema 為單位命名,因為我原本的 schema name crm
以及 order_system
都很好理解,所以我就維持原狀了。
如果覺得打這些格式很麻煩,可以到這個網頁複製貼上已經打好的程式碼,再把值改成自己想要的就可以了。
由於在這個專案的商業模式中,crm.company 以及 order_system.customer 其實是一樣的,只是因為在不同系統,所以被以不同的名詞稱呼,商業團隊也習慣用 company 稱呼自己的客戶,因此我們需要造出一張 dim_company
裡面需要包含 CRM 中跟公司有關的資訊,也需要訂單系統中的 Shipping Plan 資訊。
所以預計的 DAG 圖形大概會長這樣
其中,不論是表格名或者是欄位名,我們都希望把 customer 這個字眼都統一改成 company。所以會先對每一張源資料表建立一個 stg
資料表用來更改表格名,以及固定 data type。
一般的 sql 寫起來應該是
With result as (
select
company_id,
order_system_customer_id as order_system_company_id,
company_name,
industry,
city,
district,
created_at,
updated_at,
_etl_created_at
from crm.companies
)
select * from result
但在 dbt 中 會寫成
With result as (
select
company_id,
order_system_customer_id as order_system_company_id,
company_name,
industry,
city,
district,
created_at,
updated_at,
_etl_created_at
from {{ source("crm", "companies") }}
)
select * from result
這時候我們只要要在 model 資料夾新增一個 stg_crm_company
的檔案,並輸入上面的程式碼再存檔就好了。
我們也可以用同樣的方法新增一個 stg_order_system_company
另外,從上面的 DAG 中可以知道, dim_company
需要從 stg_crm_company
以及 stg_order_system_company
這張表中造出來。因為這兩張表都屬於 dbt 專案中下的一個 model 而不是 source,因此原本 {{ source("","") }}
的部分就要改成 {{ref("","") }}
,程式碼大概會如下:
select
crm_company.company_id,
crm_company.order_system_company_id,
crm_company.industry,
crm_company.city,
crm_company.district,
order_system_company.shipping_plant,
greatest(crm_company._etl_updated_at, order_system_company._etl_updated_at)
from {{ ref("stg_crm_company") }} as crm_company
left join {{ ref("stg_order_system_company") }} as order_system_company
如此一來 dim_company
這個 model 就算完成了。
之後只要按下 dbt run 整個 project ,就可以在資料庫中看到這些已經寫的 model 變成一張張的 view / table了。