Yellowbrick configurations

Yellowbrick configurations

dbt-yellowbrick 어댑터에서 모델을 구성하는 방법을 다루는 페이지예요. incremental 전략과 Yellowbrick 전용 성능 최적화(분산·정렬·클러스터 컬럼)를 설정할 수 있어요.

출처: 문서

본문

Incremental materialization strategies

dbt-yellowbrick 어댑터는 다음 incremental materialization 전략을 지원해요.

  • append (unique_key가 정의되지 않았을 때 기본값)
  • delete+insert (unique_key가 정의됐을 때 기본값)

이 전략들은 모두 dbt-postgres 어댑터에서 상속받은 거예요.

Performance optimizations

쿼리 성능을 높이기 위해 Yellowbrick Data의 테이블은 dbt에서 모델 레벨 구성으로 정의할 수 있는 여러 최적화를 지원해요. 이들은 컴파일·실행 시 생성되는 CREATE TABLE DDL 문에 적용돼요. 이 설정은 viewephemeral로 설정된 모델에는 효과가 없다는 점에 주의하세요.

dbt-yellowbrick은 테이블을 정의할 때 다음 Yellowbrick 전용 기능을 지원해요.

  • dist — 단일 컬럼 분산(distribution) 키를 적용하거나, 분산을 RANDOM 또는 REPLICATE로 설정
  • sort_col — 데이터가 미디어에 저장되기 전에 정렬할 단일 컬럼을 지정하는 SORT ON (column) 절 적용
  • cluster_cols — 데이터 저장 전에 클러스터링할 최대 네 개의 컬럼을 지정하는 CLUSTER ON (column, column, ...) 절 적용

정렬되거나 클러스터링된 컬럼이 있는 테이블은 쿼리에 제한(restriction)이 적용될 때 블록 스킵을 용이하게 해줘요. 자세한 내용은 Yellowbrick Data Warehouse 문서에서 찾을 수 있어요.

모델 구성 예시

  • SORT 컬럼과 함께 DISTRIBUTE REPLICATE...
{{
  config(
    materialized = "table",
    dist = "replicate",
    sort_col = "stadium_capacity"
  )
}}

select
    hash(stg.name) as team_key
    , stg.name as team_name
    , stg.nickname as team_nickname
    , stg.city as home_city
    , stg.stadium as stadium_name
    , stg.capacity as stadium_capacity
    , stg.avg_att as average_game_attendance
    , current_timestamp as md_create_timestamp
from
    {{ source('premdb_public','team') }} stg
where
    stg.name is not null

다음 모델 출력을 줍니다:

create table if not exists marts.dim_team as (
select
    hash(stg.name) as team_key
    , stg.name as team_name
    , stg.nickname as team_nickname
    , stg.city as home_city
    , stg.stadium as stadium_name
    , stg.capacity as stadium_capacity
    , stg.avg_att as average_game_attendance
    , current_timestamp as md_create_timestamp
from
    premdb.public.team stg
where
    stg.name is not null
)
distribute REPLICATE
sort on (stadium_capacity);
  • 단일 컬럼에 DISTRIBUTE하고 최대 네 개의 CLUSTER 컬럼 정의...
{{
  config(
    materialized = 'table',
    dist = 'match_key',
    cluster_cols = ['season_key', 'match_date_key', 'home_team_key', 'away_team_key']
  )
}}

select
	hash(concat_ws('||',
	    lower(trim(s.season_name)),
		translate(left(m.match_ts,10), '-', ''),
	    lower(trim(h."name")),
		lower(trim(a."name")))) as match_key
	, hash(lower(trim(s.season_name))) as season_key
	, cast(translate(left(m.match_ts,10), '-', '') as integer) as match_date_key
	, hash(lower(trim(h."name"))) as home_team_key
	, hash(lower(trim(a."name"))) as away_team_key
	, m.htscore
	, split_part(m.htscore, '-', 1)  as home_team_goals_half_time
	, split_part(m.htscore , '-', 2)  as away_team_goals_half_time
	, m.ftscore
	, split_part(m.ftscore, '-', 1)  as home_team_goals_full_time
	, split_part(m.ftscore, '-', 2)  as away_team_goals_full_time
from
	{{ source('premdb_public','match') }} m
		inner join {{ source('premdb_public','team') }} h on (m.htid = h.htid)
		inner join {{ source('premdb_public','team') }} a on (m.atid = a.atid)
		inner join {{ source('premdb_public','season') }} s on (m.seasonid = s.seasonid)

다음 모델 출력을 줍니다:

create  table if not exists marts.fact_match as (
select
    hash(concat_ws('||',
        lower(trim(s.season_name)),
        translate(left(m.match_ts,10), '-', ''),
        lower(trim(h."name")),
        lower(trim(a."name")))) as match_key
    , hash(lower(trim(s.season_name))) as season_key
    , cast(translate(left(m.match_ts,10), '-', '') as integer) as match_date_key
    , hash(lower(trim(h."name"))) as home_team_key
    , hash(lower(trim(a."name"))) as away_team_key
    , m.htscore
    , split_part(m.htscore, '-', 1)  as home_team_goals_half_time
    , split_part(m.htscore , '-', 2)  as away_team_goals_half_time
    , m.ftscore
    , split_part(m.ftscore, '-', 1)  as home_team_goals_full_time
    , split_part(m.ftscore, '-', 2)  as away_team_goals_full_time
from
    premdb.public.match m
        inner join premdb.public.team h on (m.htid = h.htid)
        inner join premdb.public.team a on (m.atid = a.atid)
        inner join premdb.public.season s on (m.seasonid = s.seasonid)
)
distribute on (match_key)
cluster on (season_key, match_date_key, home_team_key, away_team_key);

Cross-database materializations

Yellowbrick은 크로스 데이터베이스 쿼리를 지원하고, dbt-yellowbrick 어댑터는 같은 어플라이언스 인스턴스의 특정 대상을 크로스 데이터베이스 읽기할 수 있게 허용해요.

Limitations

Yellowbrick Data Warehouse용 dbt 어댑터의 이 초기 구현은 일부 사용 사례를 지원하지 않을 수 있어요. 어댑터 출력으로 나온 모든 레코드나 변환을 검증하는 것을 강력히 권장해요.

더 알아보기 (Learn more)