์ญํ | dbt๊ฐ ์ํจ | Python์ด ๋ ๋ซ๋ค |
---|---|---|
์ ํ ๋ฐ์ดํฐ ์ ์ (staging) | โ | ๊ฐ๋ฅ์ ํ์ง๋ง ๋ถํธํจ |
๋งํธ ํ ์ด๋ธ ๊ตฌ์กฐ ์ค๊ณ | โ | ๊ฐ๋ฅ์ ํจ |
์ฌ์ฉ์๋ณ๋ก ๋ฌ๋ผ์ง๋ ๊ณ์ฐ | โ ๋ถํธํจ | โ ๋งค์ฐ ์ ์ฐํจ |
์ ์ํ, ์กฐ๊ฑด ๋งค์นญ, if-else ๋ก์ง | โ ๋งค์ฐ ๋ฒ๊ฑฐ๋ก์ | โ ์ ํฉ |
์ฌ์ฉ์ ์ ๋ ฅ ๊ธฐ๋ฐ ํํฐ๋ง | โ ๋ถ๊ฐ๋ฅ | โ ํต์ฌ ๊ธฐ๋ฅ |
์ถ์ฒ ์ด์ ์ค๋ช , ๋ก์ง ํ๋ | โ | โ ์์ ๋ง์ถคํ ๊ตฌํ ๊ฐ๋ฅ |
์๋ฅผ ๋ค์ด
-- dbt์์๋ ์ด๋ฐ ๋ก์ง์ด ์์ฃผ ํ๋ค๋ค...
SELECT
CASE
WHEN user.age BETWEEN policy.min_age AND policy.max_age THEN 30
ELSE 0
END +
CASE
WHEN user.income < policy.income_ceiling THEN 25
ELSE 0
END + ...
- dbt์์๋ โuserโ๋ ์กด์ฌ ์์ฒด๊ฐ ์์
- dbt๋ โ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ๋์ผํ๊ฒ ์ ์ฉ๋๋ ๋ชจ๋ธโ์ ์ค๊ณํ๋ ๋๊ตฌ
- ๋ฐ๋ฉด Python์์๋ ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ๋๋ง๋ค ์ถ์ฒ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง๊ฒ ๋ง๋ค ์ ์์
๐ dbt๋ ์ ์ (Static) ๋ชจ๋ธ๋ง์ ์ ํฉํ์ง๋ง ์ฌ์ฉ์ ์ ๋ ฅ ๊ธฐ๋ฐ์ ๋์ (Dynamic) ์ถ์ฒ ์์คํ ์ Python์ด ๋ ๋ฌ๋ค.
์ํฉ ๊ฐ์
API๋ก ๋ฐ์ ์ ์ฑ ๋ฐ์ดํฐ ์์ (JSON or CSV๋ก ์ ์ฅ๋จ)
{
"policy_name": "์ฒญ๋
์์ธ ์ง์",
"eligibility": "๋ง 19์ธ ์ด์ 34์ธ ์ดํ / ๋ฌด์ง ๋๋ ์ฌ์ง / ๋
๋ฆฝ๊ฐ๊ตฌ",
"target_region": "์ ๊ตญ",
"link": "https://example.com"
}
์กฐ๊ฑด์ด ํ
์คํธ๋ก ๋์ด์๋ค.
์ถ์ฒ ์ ์ ๊ณ์ฐ์ ํ๋ ค๋ฉด ์ซ์๋ ๊ฐ์ผ๋ก ๋ ์ปฌ๋ผ์ด ํ์ํ๋ค.
๊ทธ๋์ ํ์ํ ๊ฒ ๋ฐ๋ก dbt ๊ตฌ์กฐํ!
- “๋ง 19์ธ ์ด์ 34์ธ ์ดํ” โ min_age = 19, max_age = 34
- “๋ฌด์ง ๋๋ ์ฌ์ง” โ job_status = ‘๋ฌด์ง,์ฌ์ง’
- “๋ ๋ฆฝ๊ฐ๊ตฌ” โ household_type = ‘๋ ๋ฆฝ๊ฐ๊ตฌ’
- ๊ทธ๋ฆฌ๊ณ target_region, income_ceiling ๋ฑ๋ฑ๋ ์ปฌ๋ผํ
dbt ๊ตฌ์กฐํ ํ๋ฆ
1. raw_policies ํ ์ด๋ธ (API ๋ฐ์์ ์ ์ฅํ ๊ทธ๋๋ก)
SELECT * FROM {{ source('raw', 'policies') }}
2. stg_policies.sql (์ ์ ๋จ๊ณ)
SELECT
policy_name,
REGEXP_EXTRACT(eligibility, '๋ง (\d{2})์ธ ์ด์')::INT AS min_age,
REGEXP_EXTRACT(eligibility, '(\d{2})์ธ ์ดํ')::INT AS max_age,
CASE
WHEN eligibility LIKE '%๋ฌด์ง%' AND eligibility LIKE '%์ฌ์ง%' THEN '๋ฌด์ง,์ฌ์ง'
WHEN eligibility LIKE '%๋ฌด์ง%' THEN '๋ฌด์ง'
WHEN eligibility LIKE '%์ฌ์ง%' THEN '์ฌ์ง'
ELSE '๋ฌด๊ด'
END AS job_status,
CASE
WHEN eligibility LIKE '%๋
๋ฆฝ๊ฐ๊ตฌ%' THEN '๋
๋ฆฝ๊ฐ๊ตฌ'
ELSE '๋ฌด๊ด'
END AS household_type,
target_region,
link
FROM {{ source('raw', 'policies') }}
3. mart_policies.sql (์ถ์ฒ ์์ง์ด ์ฌ์ฉํ ์ต์ข ํ ์ด๋ธ)
SELECT
policy_name,
min_age,
max_age,
job_status,
household_type,
target_region,
link
FROM {{ ref('stg_policies') }}
WHERE min_age IS NOT NULL AND max_age IS NOT NULL
๊ฒฐ๋ก
- API๋ก ๋ฐ์ ํ ์คํธ ๊ธฐ๋ฐ ์ ์ฑ ์กฐ๊ฑด์ โ ์ ์ ๋ ์์น/๊ฐ ๊ธฐ๋ฐ ํ ์ด๋ธ๋ก ๋ง๋๋ ๊ฒ dbt ๊ตฌ์กฐํ
- ๊ทธ๋์ผ Python ์ถ์ฒ ๋ก์ง์์ ์กฐ๊ฑด ํํฐ๋ง/์ ์ ๊ณ์ฐ์ ์๋ํํ ์ ์๋ค.