최종 출력 데이터를 만드는 과정을 살펴보자
최종 출력 데이터 과정에서는 Materialization이라는 것을 이해해야 된다.

Raw Data 에서부터 클린업 부터 필요한 데이터만 추출 및 계산해서 Core 테이블이 출력된다

Jinja 템플릿과 ref 태그를 사용해서 dbt 내 다른 테이블들을 액세스

❖ 파이썬이 제공해주는 템플릿 엔진으로 Flask에서 많이 사용
● Airflow에서도 사용함
❖ 입력 파라미터 기준으로 HTML 페이지(마크업)를 동적으로 생성
❖ 조건문, 루프, 필터등을 제공

WITH src_user_metadata AS (
SELECT * FROM {{ ref('src_user_metadata') }}
)
SELECT
user_id,
age,
gender,
updated_at
FROM
src_user_metadata
최종 테이블로 Incremental Table로 빌드 (materialized = 'incremental')

on_schema_change='fail’ = 입력 테이블의 스키마가 바뀌었다면 fail로 처리.

마지막으로 dbt run 수행하면 이전 글 처럼 폴더가 생성되어있을 것이다.

Compile 후 결과를 확인하는 것이 좋다.
경로 : learn_dbt/target/compiled/learn_dbt/models/fact
fact테이블의 경우 Compile된 형태로 코드가 변환된 것을 확인할 수 있을 것이다.

src 테이블들을 굳이 빌드할 필요가 있나? CTE형태로 봐도 될거 같다면 아래와 같이 코딩
models:
learn_dbt:
# Config indicated by + and applies to all files under models
+materialized: view
dim:
+materialized: table
src:
+materialized: ephemeral #CTE를 사용하겠다는 명령어
이후 View 테이블들은 삭제 처리.

run을 돌리면 각 테이블은 CTE 형태로 임베드되어서 빌드됨.

dim_user_variant와 dim_user_metadata를 조인
WITH um AS (
SELECT * FROM {{ ref("dim_user_metadata") }}
), uv AS (
SELECT * FROM {{ ref("dim_user_variant") }}
)
SELECT
uv.user_id,
uv.variant_id,
um.age,
um.gender
FROM uv
LEFT JOIN um ON uv.user_id = um.user_id
dim_user와 fact_user_event를 조인 - analytics 폴더를 models 밑에 생성
WITH u AS(
SELECT * FROM {{ ref("dim_user") }}
), ue AS (
SELECT * FROM {{ ref("fact_user_event") }}
)
SELECT
variant_id,
ue.user_id,
datestamp,
age,
gender,
COUNT(DISTINCT item_id) num_of_items, -- 총 impression
COUNT(DISTINCT CASE WHEN clicked THEN item_id END) num_of_clicks, -- 총 click
SUM(purchased) num_of_purchases, -- 총 purchase
SUM(paidamount) revenue -- 총 revenue
FROM ue LEFT JOIN u ON ue.user_id = u.user_id
GROUP by 1, 2, 3, 4, 5
이후 dbt run을 돌리면 된다!