# Intro to Data Build Tool (dbt) မြန်မာဘာသာစကား နဲ့ `dbt` အကြောင်း ရေးသားမှု နည်းနေသေးတော့ ပြည်တွင်းကလူတွေအတွက် `dbt` tool နဲ့ စိမ်းသလိုတော့ ဖြစ်နေနိုင်ပါတယ်။ `dbt` က Data Analyst / Data Engineer တွေကို မရှိမဖြစ် အသုံးဝင်လာတဲ့ tool လို့ ပြောလို့ ရပါတယ်။ dbt ဆိုတာက Extract-Transform-Load (ETL) သို့မဟုတ် Extract-Load-Transform (ELT) data pipeline ထဲမှာ Transform ဆိုတဲ့ အပိုင်းကို အထူးပြုလုပ်ဆောင်ပေးတဲ့ open-source tool တစ်ခု ဖြစ်ပါတယ်။ နောက်ပြီး dbt ကို SQL-based ဖြစ်တဲ့ data pipelines တွေအတွက် Software Engineering fundamentals တွေကို ယူဆောင်ပေးလာတဲ့ tool တစ်ခုလဲ ပြောကြပါတယ်။ dbt ကြောင့် - - Data Project Structure တွေ ပိုပေါ်လွင်လာတယ်။ - SQL ကို Jinja Templating နဲ့ တွဲဖက် အသုံးပြုလို့ရတာကြောင့် reusable ပိုဖြစ်လာတယ်။ - Production / Dev environment ခွဲခြား လုပ်ကိုင်ဖို့ ပိုလွယ်ကူလာတယ်။ - Data Testing / Unit Testing တွေကို အလွယ်တကူ ထည့်လို့ ရလာတယ်။ - Documentation ပိုင်းမှာလဲ ပိုကောင်းလာတယ်။ - Analytics Engineering ဆိုတဲ့ သဘောတရားကလဲ dbt ကြောင့် ပိုရုပ်လုံးပေါ်လာတယ်။ ### ETL vs ELT - ETL မှာက Transformation အပိုင်းက database အပြင်ဘက်မှာ လုပ်တယ် လို့ ယေဘုယျနားလည်လို့ ရတယ်။ ဒါမှမဟုတ် Transform ပိုင်းကို SQL ကို အဓိက သုံးလို့ မရပဲ Python (or) အခြား Programming Language တစ်ခုခုနဲ့ complex ဖြစ်တဲ့ Transformation task တွေကို အရင် လုပ်ပြီးမှ Database ထဲကို ထည့်တာမျိုးလို့လဲ နားလည်လို့ ရပါတယ်။ - ELT ကကျတော့ Transformation ကို database ထဲမှာ ပြုလုပ်တာပါ။ SQL ကို အဓိက ထားတဲ့ transformation task တွေ ဖြစ်ပါတယ်။ ![[Pasted image 20250318101602.png]] Image Credit -> [FullStackChronicles](https://fullstackchronicles.io/dbt-in-five-minutes) ### Models - dbt မှာ အဓိက ကျတဲ့ concept ကတော့ Model ဖြစ်ပါတယ်။ Model တွေကို SQL query တွေနဲ့ ဖွဲ့စည်းထားပြီး Model Configuration ကိုတော့ YML file ထဲမှာ ရေးပါတယ်။ Models တွေက အဓိကအားဖြင့် `SELECT` statement နဲ့ ရေးသားပြီး `.sql` file တွေအနေနဲ့ သိမ်းဆည်းပါတယ်။ ဒါပေမယ့် dbt မှာက SQL Model တွေအပြင် Python Model တွေကိုလဲ တည်ဆောက်လို့ ရပါတယ်။ - Models တွေကို `model-paths` config ကြေညာထားတဲ့ folder ထဲမှာ သိမ်းဆည်းပါတယ်။ များသောအားဖြင့် `models/` folder ကိုပဲ သုံးပါတယ်။ - Model တွေရဲ့ configuration ကို နေရာ ၃ နေရာမှာ ကြေညာလို့ ရပါတယ်။ အသေးစိတ်ကိုတော့ [Documentation](https://docs.getdbt.com/reference/model-configs) မှာ ဆက်ဖတ်ပါ။ 1. [[4.dbt_YAML_configs#dbt_project.yml|dbt_project.yml]] 2. Property YML files (`schema.yml` (or) `properties.yml` (or) `<model_name>.yml`) 3. Config block - [Model Configuration](https://docs.getdbt.com/reference/model-configs) နဲ့ [Model Properties](https://docs.getdbt.com/reference/model-properties) က မတူပါဘူး။ - Configuration ဆိုတာက management ဆန်ဆန် အလုပ်တွေအတွက် ကြေညာပါတယ်။ ဥပမာ - `schema` , `contract` ကြေညာတာမျိုး။ - Properties ကကျတော့ model တစ်ခုရဲ့ ဖွဲ့စည်းပုံကို ကြေညာတာမျိုးပါ။ ဥပမာ - `description`, `columns` စသဖြင့်။ ဒါပေမယ့် လိုအပ်ရင် `config` ကို properties ထဲမှာ လာကြေညာလို့ ရပါတယ်။ - ဒါပေမယ့် best practice အနေနဲ့တော့ မလုပ်ကြတာ များတယ်။ - ဘာကြောင့်လဲ ဆိုတော့ Developer အနေနဲ့ ဘယ်နေရာမှာ ဘာကို ကြေညာခဲ့မှန်း စနစ်မကျတော့နိုင်တာမျိုး ဖြစ်နိုင်တာရယ် ၊ property yml ထဲမှာ သွားကြေညာရတာ ဖြစ်တဲ့အတွက် readiability မရှိတာရယ်ကြောင့် ဖြစ်တယ်။ - ယေဘုယျအားဖြင့်တော့ folder လိုက် (အစုလိုက်) management လုပ်ရမှာမျိုး config ဆိုရင် [[4.dbt_YAML_configs#dbt_project.yml|dbt_project.yml]] မှာ ကြေညာပြီး model တစ်ခုချင်းဆီအလိုက် သိသိသာသာ manage လုပ်ရမှာမျိုး ဆိုရင် `{{ config }}` block ကို အသုံးပြုပြီး ကြေညာပါတယ်။ - Model Config တွေထဲမှာ အရေးကြီးဆုံး (အသုံးအများဆုံး) ကတော့ [materialized](https://docs.getdbt.com/reference/resource-configs/materialized) config ဖြစ်ပါလိမ့်မယ်။ အသေးစိတ်ကိုတော့ ဒီမှာ [[5_dbt Materializations|Materialization]] ဆက်ရေးပါမယ်။ ### Model Creation Precedence - Materialization ကို တည်ဆောက်တဲ့ life cycle ကိုတော့ အောက်ပါအတိုင်း အရေးပါမှု အစဥ်လိုက်အတိုင်း သိရှိထားဖို့ လိုပါတယ်။ 1. အကယ်ရွေ့ သတ်မှတ်ထားတဲ့ location/schema မှာအောက်မှာ Model က ရှိမနေသေးဘူးဆိုရင် Model အသစ်ကို တည်ဆောက်ပါတယ်။ 2. အကယ်ရွေ့ Model က ရှိနေပြီးသား ၊ ဒါပေမယ့် မတူညီတဲ့ Materialization Type ဖြစ်နေတယ် ဆိုရင် ရှိပြီးသား Model ကို drop ပြုလုပ်ပြီး အသစ်တည်ဆောက်ပါတယ်။ 3. အကယ်ရွေ့ `--full-refresh` flag ပြလာခဲ့တယ် ဆိုရင် ဘယ်လို configuration changes ဖြစ်ဖြစ် ၊ [on_configuration_change](https://docs.getdbt.com/reference/resource-configs/on_configuration_change) setting ကို ဖြစ်ဖြစ် ဂရုမစိုက်တော့ပဲ ရှိပြီးသားဆိုရင် replace လုပ်ပြီး/မရှိသေးရင် model ကို အသစ်အဖြစ် တည်ဆောက်ပါတယ်။ 4. အကယ်ရွေ့ configuration changes အပြောင်းအလဲ မရှိခဲ့ဖူးဆိုရင်တော့ ကြေညာထားတဲ့ Materialization Type အတွက် default action ကို လုပ်ဆောင်ပါတယ်။ (ဥပမာ - `table` materialization ဆိုရင် `drop & recreate` လုပ်တာမျိုး) 5. Configuration changes အပြောင်းအလဲ ရှိခဲ့တယ် ဆိုရင် [on_configuration_change](https://docs.getdbt.com/reference/resource-configs/on_configuration_change) setting မှာ ကြေညာထားတဲ့အတိုင်း သက်ရောက်ပါတယ်။