Lời mở đầu
Phần trước mình đã giải thích dbt là gì, và tại sao nên dùng dbt. Trong phần này, mình sẽ đi qua cách setup 1 project dbt cơ bản với postgresql. Nếu ai chưa đọc phần trước, có thể đọc tại đây
Cài đặt dbt
Để cho đơn giản, mình sẽ cài dbt bằng pip
pip install dbt-core
Ngoài ra, còn cần cài thêm module support cho việc connect tới các data platform cần dùng. Ví dụ ở đây mình dùng postgresql, mình sẽ cài thêm
pip install dbt-postgres
Mọi người có thể tự tìm module tương ứng ở document dbt nhé
Các component bắt buộc trong dbt project
dbt_project.yml
File này cần được để ở root directory của project. File chứa các thông tin về cấu hình project.
Đầu tiên, các field name
, version
, config-version
, profile
là bắt buộc. Ngoài ra, như đã giải thích ở phần trước, dbt project bao gồm chính là các model, vậy nên model-paths
cũng bắt buộc (relative path dẫn tới folder chứa các model).
dbt mặc định sau khi transform sẽ write vào VIEW ở warehouse. Phần cấu hình +materialized: table
nhằm mục đích write vào TABLE thay vì VIEW. Ngoài ra, user có thể chọn write ra MATERIALIZED VIEW, ... tùy chọn, và cũng có thể cấu hình destination cho từng sub-directory trong folder models.
name: 'dbt_lab'
version: '1.1.0'
config-version: 2 profile: "{{ env_var('DBT_PROFILE', 'tuandz') }}" model-paths: ["models"]
test-paths: ["tests"]
macro-paths: ["macros"] models: dbt_lab: +materialized: table
profiles.yml
File này chứa các dbt profile, mỗi profile bao gồm thông tin để connect tới data platform, ví dụ host, port, user, password, ... Tại sao cần nhiều profile ư? Giống như môi trường dev, test, prod, ... mỗi profile để connect tới 1 warehouse riêng. Khi user chạy, có thể chọn profile qua field profile
ở file dbt_project.yml
.
tuandz: target: dev outputs: dev: type: postgres host: localhost user: postgres password: postgres port: 5432 dbname: postgres schema: public connect_timeout: 10 # default 10 seconds retries: 3
Chi tiết cấu hình connection cho từng loại data platform có thể đọc ở đây
Khởi tạo các model
Tạo folder models
(cùng tên với value của field model-paths
ở trên), sau đó có 2 việc cần làm
Cấu hình sources (optional): trong dbt, có thể code tên table bằng function {{ source() }}
. Cái này cũng giống như sử dụng variable trong code vậy, thay vì cứ viết đi viết lại <table schema>.<table name>
, user có thể cấu hình source cho tiện
Trong folder models
, tạo folder sources
. Trong folder này, các file định nghĩa source là các file yml, tạo sub-directory thoải mái (tạo nhiều file thoải mái).
name
là tên source (đặt là cái gì cũng được). Table được refer bằng cách dùng {{ source('<source name>', '<table name>') }}
. Lưu ý là table phải được khai báo trong source rồi mới có thể dùng được (ví dụ table urls_69
chưa được khai báo ở source dưới thì không dùng được)
version: 2 sources: - name: tuandz_db database: postgres schema: public tables: - name: news_urls - name: urls_2
Viết model: Trong folder models
, mỗi file SQL đại diện cho 1 model (không để trong sources
). File SQL viết như SQL bình thường, tương ứng với SQL syntax của data platform được chọn (ở đây là Postgresql). Code model chỉ là SELECT, không cần CREATE, INSERT, ... gì cả, phần insert lại vào data platform được dbt handle, mình không cần lo.
Ví dụ, model của mình có thể viết như sau
SELECT * FROM {{ source('tuandz_db', 'urls_2') }}
Để chạy model, đứng ở root directory và run command để chạy toàn bộ model đang có
dbt run --project-dir ./
Tips:
- Có thể export env variable
DBT_PROJECT_DIR
để đỡ phải gắn flag--project-dir
- Để chạy 1 số model thay vì chạy toàn bộ, add flag
--select "model1,model2"
Sau khi run thành công, table/view/materialized view tương ứng sẽ được tạo trong data platform, với tên là tên model (tên file SQL). Để đổi tên table thay vì dùng tên default là tên file sql, thêm phần sau vào đầu file sql
{{ config( alias="tuandz_new_table_name" )
}}