JUST DO IT!

๊ฐ„๋‹จํ•œ DBT ์‹ค์Šตํ•ด๋ณด๊ธฐ (with Redshift) - TIL230622(2) ๋ณธ๋ฌธ

TIL

๊ฐ„๋‹จํ•œ DBT ์‹ค์Šตํ•ด๋ณด๊ธฐ (with Redshift) - TIL230622(2)

sunhokimDev 2023. 6. 23. 01:09

๐Ÿ“š KDT WEEK 12 DAY 4 TIL

  • Data Build Tool (DBT)
  • DBT ๊ฐ„๋‹จํ•œ ์‹ค์Šต

 


 

๐ŸŸฅ Data Build Tool

 

 

ELT์šฉ ์˜คํ”ˆ์†Œ์Šค (In-warehouse data transformation)

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค๋ฅผ ์ง€์›(Redshift, Snowflake, Bigquery...)

 

  • ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ณ  ๋กค๋ฐฑ๋„ ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ๊ฐ„ ๋ฆฌ๋‹ˆ์ง€ ํ™•์ธ ๊ฐ€๋Šฅ
  • ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ํ…Œ์ŠคํŠธ ๋ฐ ์—๋Ÿฌ ๋ณด๊ณ 
  • ํžˆ์Šคํ† ๋ฆฌ ํ…Œ์ด๋ธ”๋กœ ํ…Œ์ด๋ธ” ๋ณ€๊ฒฝ ์ถ”์ 

 

๋ฐ์ดํ„ฐ ์›จ์–ดํ•˜์šฐ์Šค์œ„์— DBT๋ฅผ ์˜ฌ๋ฆฌ๊ณ , DBT๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด Airflow๋ฅผ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์ผ๋ฐ˜์ 

 

๐Ÿ“ฆ DBT ๊ตฌ์„ฑ ์ปดํฌ๋„ŒํŠธ : ๋ฐ์ดํ„ฐ ๋ชจ๋ธ(models), ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๊ฒ€์ฆ(tests), ์Šค๋ƒ…์ƒท(snapshots)

 


 

DBT ์„ค์น˜(redshift)

 

pip3 install dbt-redshift # ์•ˆ๋˜๋ฉด sudo

# ์„ค์น˜ํ›„
dbt init learn_dbt

 

dbt init ๊ณผ์ •์—์„œ redshift ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

 

์—ฐ๊ฒฐ ์™„๋ฃŒ ํ›„์—๋Š” dbt init ๋’ค์— ์ž…๋ ฅํ•œ ์ด๋ฆ„์œผ๋กœ ํด๋”๊ฐ€ ํ•˜๋‚˜ ์ƒ์„ฑ๋œ๋‹ค.

 

์ƒ์„ฑ๋œ ํด๋”์˜ ๋‚ด์šฉ๋ฌผ

 

์—ฌ๊ธฐ์— ์ƒ์„ฑ๋œ dbt_project.yml์— ํ™˜๊ฒฝ ์ •๋ณด๊ฐ€ ์ €์žฅ๋œ๋‹ค.

์ด ํŒŒ์ผ์— SQL์„ ํ†ตํ•ด ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ DB์— table์ด๋‚˜ view ๋“ฑ์œผ๋กœ ์ €์žฅ๋ ์ง€ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด ๋ถ€๋ถ„์€ ์•„๋ž˜์˜ Materialization ์„ค๋ช…์—์„œ ๋‹ค๋ฃฌ๋‹ค!

 


 

๐Ÿงฑ Model

ELT ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๊ธฐ๋ณธ์ด ๋˜๋Š” ๋นŒ๋”ฉ ๋ธ”๋ก (ํ…Œ์ด๋ธ”, ๋ทฐ, CTE)

models ํด๋”์•ˆ์— SQL ๋ฌธ์„ ์ž‘์„ฑํ•˜์—ฌ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ ์žฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

๋ณดํ†ต ELT ๊ณผ์ •์€ raw -> staging -> core ํ˜•ํƒœ๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

Input์œผ๋กœ ์ž…๋ ฅ(raw)์™€ ์ค‘๊ฐ„(staging, src) ๋ฐ์ดํ„ฐ๊ฐ€ ์ •์˜๋˜์–ด,

Output์œผ๋กœ ์ตœ์ข…(core) ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋Š” ํ˜•ํƒœ๋กœ ์ง„ํ–‰๋œ๋‹ค.

 

๋ณดํ†ต raw๋Š” CTE, staging View, core๋Š” Table๋กœ ์ €์žฅ๋œ๋‹ค.

 

โš’๏ธ Materialization

์ž…๋ ฅ ๋ฐ์ดํ„ฐ(ํ…Œ์ด๋ธ”)๋“ค์„ ์—ฐ๊ฒฐํ•ด์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ(ํ…Œ์ด๋ธ”)์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ

ํŒŒ์ผ์ด๋‚˜ ํ”„๋กœ์ ํŠธ ๋ ˆ๋ฒจ์—์„œ ๊ฐ€๋Šฅ

 

Materialization ์ข…๋ฅ˜ : View, Table, Incremental(Table Appends), Ephemeral(CTE)

 

๋ฐ์ดํ„ฐ ์‚ฌ์šฉ ์ฃผ๊ธฐ์™€ ์ˆ˜์ • ์œ ๋ฌด์— ๋”ฐ๋ผ ์ข…๋ฅ˜๋ฅผ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ, ์ด๋Š” dbt_project.yml์— ์ž‘์„ฑํ•œ๋‹ค.

 

model์˜ materialized format ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•

 

dbt_project.yml ๋‚ด์šฉ ์ผ๋ถ€๋ฅผ ํŽธ์ง‘ํ•˜๋ฉด ๋œ๋‹ค.

 

ex)  example ํด๋” ๋ฐ‘์— ์žˆ๋Š” ํ…Œ์ด๋ธ”๋“ค์€ ๋ชจ๋‘ view๋กœ ๋นŒ๋“œ

models:
  learn_dbt:
    # Config indicated by + and applies to all files under models/example/
    example:
      +materialized: view

 

ex) learn_dbt ํ”„๋กœ์ ํŠธ์˜ ํ…Œ์ด๋ธ”๋“ค์€ ๊ธฐ๋ณธ์ ์œผ๋กœ view ๋นŒ๋“œํ•˜์ง€๋งŒ, dim ํด๋” ๋ฐ‘์œผ๋กœ๋Š” ๋ชจ๋‘ table๋กœ ๋นŒ๋“œ

models:
  learn_dbt:
    +materialized: view
    dim:
      +materialized: talbe

 


 

๐ŸŸฆ ์‹ค์Šต

 

1. INPUT ๋งŒ๋“ค๊ธฐ

 

dbt_project.yml ์—์„œ ํ•„์š”์—†๋Š” example์˜ +materialized ๋ถ€๋ถ„์„ ์‚ญ์ œํ•˜๊ณ  example ํด๋”๋„ ์‚ญ์ œํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  src๋กœ ์‚ฌ์šฉํ•  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด models/src/ ์— sql ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๋‚ด Redshift์˜ raw_data ์Šคํ‚ค๋งˆ์— ์ €์žฅ๋œ user_event, user_metadata, user_variant ๋ฐ์ดํ„ฐ์˜ ํŠน์ • ์ปฌ๋Ÿผ์„ ๊ฐ€์ ธ์˜ค๊ฒŒ๋œ๋‹ค.

 

๊ฐ๊ฐ์˜ ํ…Œ์ด๋ธ”์˜ ๋‚ด์šฉ์€ ์ด๋ ‡๋‹ค.

  • user_event : ์‚ฌ์šฉ์ž์˜ ํ–‰๋™ ์ •๋ณด (๊ตฌ๋งค์—ฌ๋ถ€ ๋“ฑ)
  • user_metadata : ์‚ฌ์šฉ์ž์˜ ์ •๋ณด ( ๋‚˜์ด, ์„ฑ๋ณ„ ๋“ฑ)
  • user_variant : ๊ฐ ์‚ฌ์šฉ์ž์˜ AB ํ…Œ์ŠคํŠธ ๊ตฌ๋ถ„ (์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ A์ธ์ง€, B์ธ์ง€)

 

CTE๋ฅผ ํ†ตํ•ด SQL ๋ฌธ์„ ๊ตฌ์ถ•ํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  dbt ๋ฃจํŠธ ํด๋”์—์„œ dbt run ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰์‹œ์ผœ๋ณด๋ฉด,

3๊ฐœ์˜ ๋ชจ๋ธ์„ ์ฐพ์•„ SQL์„ ์‹คํ–‰ํ•˜๊ณ  VIEW๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

dbt run ์‹คํ–‰ ๊ฒฐ๊ณผ

 

์ด๋กœ์จ ์„ธ ๊ฐœ์˜ INPUT์„ ๋งŒ๋“ค๊ฒŒ ๋œ ๊ฒƒ์ด๋‹ค.

 

2. OUTPUT ๋งŒ๋“ค๊ธฐ

 

models ํด๋”์— dim, fact ํด๋”๋ฅผ ๊ฐ๊ฐ ์ƒ์„ฑํ•˜๊ณ , ์•ˆ์— SQL ํŒŒ์ผ์„ ๋„ฃ๋Š”๋‹ค.

dim์—๋Š” Dimension ํ…Œ์ด๋ธ”์ด, fact์—๋Š” Fact ํ…Œ์ด๋ธ”์ด ์ƒ์„ฑ๋˜๋Š” SQLํŒŒ์ผ์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

 

  • Fact ํ…Œ์ด๋ธ” : ๋งค์ถœ ์ˆ˜์ต, ํŒ๋งค๋Ÿ‰, ์‚ฌ์šฉ์ž์˜ ํ–‰๋™ ์ •๋ณด๊ฐ™์€ ๋ถ„์„์— ํ•„์š”ํ•œ ๋ฉ”์ธ ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”
  • Dimension ํ…Œ์ด๋ธ” : Fact ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ƒ์„ธ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ…Œ์ด๋ธ” ( ex. ์‚ฌ์šฉ์ž์˜ ๋‚˜์ด ๋“ฑ)

๋‚ด ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์„ ๋‹ด๊ณ ์žˆ๋Š” user_event ๊ฐ€ Fact ํ…Œ์ด๋ธ”์ด๋˜๊ณ , ๋‚˜๋จธ์ง€๊ฐ€ Dimension ํ…Œ์ด๋ธ”์ด ๋œ๋‹ค.

 

Dimension ํ…Œ์ด๋ธ”์˜ ๊ฒฝ์šฐ src๋•Œ์™€ ๋น„์Šทํ•˜๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.

WITH ์ ˆ์— ์‚ฌ์šฉํ•œ ref(ํ…Œ์ด๋ธ”์ด๋ฆ„)์€ ๋‚ด DB์— ์žˆ๋Š” ํ•ด๋‹น ํ…Œ์ด๋ธ”์„ ๊ฐ€์ ธ์™€์„œ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

 

user_variant

 

fact ํ…Œ์ด๋ธ”์— ํ•ด๋‹นํ•˜๋Š” user_event์˜ ๊ฒฝ์šฐ Incremental (๋ฐ์ดํ„ฐ ๋งค๋ฒˆ ๊ฐฑ์‹ ์ด ์•„๋‹Œ ๊ณ„์† ์‚ฝ์ž…)ํ•˜๊ฒŒ ๋งŒ๋“ค์—ˆ๋‹ค.

์ด๋ฅผ CTE ์œ„์— ํ…œํ”Œ๋ฆฟ ํ˜•์‹์—๋‹ค config๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

on_schema_change๋Š” ํ•ด๋‹น ํ…Œ์ด๋ธ”์˜ ์Šคํ‚ค๋งˆ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ์ง€ ์„ค์ •ํ•œ๋‹ค.

'fail'์˜ ๊ฒฝ์šฐ ๊น”๋”ํ•˜๊ฒŒ ์‹คํŒจํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  Incrementalํ•˜๊ฒŒ ๋™์ž‘ํ•˜๊ธฐ ์œ„ํ•ด WHERE๋ฌธ์„ ํ†ตํ•ด datestamp๊ฐ€ ๊ฐ€์žฅ ์ตœ๊ทผ์ธ ๋ฐ์ดํ„ฐ์— ํ•œํ•ด์„œ๋งŒ Insert๋ฅผ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์ž‘์„ฑํ–ˆ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๊ธ€์„ ์ž‘์„ฑํ•  ๋•Œ๋Š” WHERE์„ ํฌํ•จํ•˜์ง€ ์•Š๊ณ  ํ•œ๋ฒˆ ์‹คํ–‰ํ–ˆ๋‹ค๊ฐ€ WHERE์ ˆ์„ ๋„ฃ๊ณ  ์‹คํ–‰ํ–ˆ๋Š”๋ฐ,

๋‚ด ์ƒ๊ฐ์— WHERE์ ˆ์ด ํฌํ•จ๋œ ์ƒํƒœ๋กœ ์ฒ˜์Œ ์‹คํ–‰ํ•˜๋ฉด fact_user_event ํ…Œ์ด๋ธ”์— ๋‚ด์šฉ์ด ์•ˆ๋‹ด๊ธธ๊ฒƒ๊ฐ™๋‹ค..

๊ทธ๋Ÿฌ๋‹ˆ ์ตœ์ดˆ ์‹คํ–‰ํ•  ๋•Œ๋Š” WHERE์ ˆ์—†์ด ํ•œ๋ฒˆ ์‹คํ–‰ํ•ด์•ผ ๋˜์ง€ ์•Š์„๊นŒ?

 

fact_user_event์˜ ๊ฒฝ์šฐ ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  dbt_project.yml ํŒŒ์ผ์—์„œ ๊ธฐ๋ณธ ์ƒ์„ฑํ˜•์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค.

์ด๋กœ์จ ๊ธฐ๋ณธ ์ƒ์„ฑํ˜•์€ view, dim ํด๋” ๋ฐ‘์œผ๋กœ๋Š” table๋กœ ์ƒ์„ฑํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

์ฐธ๊ณ ๋กœ ์œ„ ์ด๋ฏธ์ง€์ฒ˜๋Ÿผ ์ฃผ์„์œผ๋กœ ํ•œ๊ธ€์„ ๋‹ฌ์•„๋‘๋ฉด dbt compileํ•  ๋•Œ ์ธ์ฝ”๋”ฉ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ๋‹คใ… 

๊ทธ๋ž˜์„œ ์ด๋ฏธ์ง€๋งŒ ์ƒ์„ฑํ•˜๊ณ  ์ฃผ์„์€ ๋ฐ”๋กœ ์ง€์› ๋‹คใ… 

 

dbt_project.yml ํŽธ์ง‘๊นŒ์ง€ ๋๋‚˜๋ฉด dbt run์„ ์‹คํ–‰ํ•ด๋ณด์ž.

fact์™€ dim์€ table๋กœ, src์—์„œ๋Š” view๋กœ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. (incremental๋„ table)

 

๋ฐ‘์ค„์นœ ๊ณณ์„ ๋ณด๋ฉด, fact_user_event๊ฐ€ incremental ์ฒ˜๋ฆฌ๋˜์—ˆ๋‹ค

 

์ž˜ ์ƒ์„ฑ๋˜์—ˆ๋Š”์ง€ Colab์—์„œ ํ™•์ธํ•ด๋ณด๋‹ˆ, ์ƒ์„ฑ๋œ view์™€ table์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

ํ…Œ์ด๋ธ”๋“ค์„ ํ™•์ธํ•ด๋ณด๋‹ˆ ์ž˜ ๋„˜์–ด์™”๋‹ค.

 

3. analytics ํ•ด๋ณด๊ธฐ

 

dim์˜ ๋‘ ํ…Œ์ด๋ธ”์„ ์กฐ์ธํ•œ user ํ…Œ์ด๋ธ”์„ ๋งŒ๋“ค์–ด๋ณด์ž.

์‚ฌ์‹ค JOIN๋งŒ ๋“ค์–ด๊ฐ”์„ ๋ฟ, ์•„๊นŒ dim ํด๋”์˜ SQL์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •๊ณผ ๋˜‘๊ฐ™๋‹ค.

 

dim_user.sql

 

์ด์™ธ์˜ analytics๋Š” ์œ„์—์„œ ์ž‘์„ฑํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ž์œ ๋กญ๊ฒŒ ์ €์žฅํ•œ ํ…Œ์ด๋ธ”์„ ๋ถˆ๋Ÿฌ์™€์„œ SQL๋ฌธ์„ ์ž‘์„ฑํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋œ๋‹ค!

 

++ ๊ณ ์น ๋ถ€๋ถ„

src ํด๋”์˜ SQL์˜ ๊ฒฝ์šฐ ๊ผญ View์ผ ํ•„์š”์—†์ด CTE๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ํ•œ๋‹ค.

dbt_project.yml์„ ๊ฐ„๋‹จํžˆ ์ˆ˜์ •ํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋˜๋Š” ์ผ์ด๋‹ค!