event_time

event_time

event_time는 dbt가 이벤트가 언제 발생했는지 이해하도록 도와주는 설정이에요. 마이크로배치(microbatch) 전략이나 --sample 플래그 같은 기능에서 필수적으로 필요한 값이에요.

출처: 문서

본문

💡 알고 계셨나요?

dbt v1.9부터, 또는 dbt "v1 Latest" 릴리스 트랙에서 사용할 수 있어요.

모델 (Models)

dbt_project.yml

models:
  resource-path:
    +event_time: my_time_field

models/properties.yml

models:
  - name: model_name
    config:
      event_time: my_time_field

models/modelname.sql

{{ config(
    event_time='my_time_field'
) }}

Seeds

dbt_project.yml

seeds:
  resource-path:
    +event_time: my_time_field

seeds/properties.yml

seeds:
  - name: seed_name
    config:
      event_time: my_time_field

Snapshots

dbt_project.yml

snapshots:
  resource-path:
    +event_time: my_time_field

(dbt v1.9 이상 적용)

snapshots/properties.yml

snapshots:
  - name: snapshot_name
    config:
      event_time: my_time_field

Sources

dbt_project.yml

sources:
  resource-path:
    +event_time: my_time_field

models/properties.yml

sources:
  - name: source_name
    config:
      event_time: my_time_field

정의 (Definition)

dbt는 event_time을 사용해 이벤트가 발생한 시점을 이해해요. 프로젝트 YAML 파일(dbt_project.yml), properties YAML 파일(models/properties.yml), 또는 모델, seeds, sources의 SQL 파일 config에서 설정하세요.

필수

incremental microbatch 모델의 경우, 업스트림 모델에 event_time이 설정되어 있지 않으면 dbt는 배치 처리 중에 이를 자동으로 필터링할 수 없고, 모든 배치 실행마다 전체 테이블 스캔을 수행해요.

이를 피하려면 필터링해야 할 모든 업스트림 모델에 event_time을 설정하세요. auto-filtering 옵트아웃으로 모델을 자동 필터링에서 제외하는 방법을 알아보세요.

사용법 (Usage)

event_timeincremental microbatch 전략(dbt v1.10 이상 적용), --sample 플래그에 필수이며, CI/CD 워크플로에서 Advanced CI의 compare changes에 매우 권장돼요. 이 경우 CI와 프로덕션 환경 사이에서 같은 시간 조각의 데이터가 올바르게 비교되도록 보장해 줘요.

모범 사례 (Best practices)

event_time을 실제 이벤트의 타임스탬프를 나타내는 필드 이름(예: account_created_at)으로 설정하세요. 이벤트의 타임스탬프는 이벤트 수집(ingestion) 날짜가 아니라 "행이 발생한 시각"을 나타내야 해요. 실제로 그렇지 않은 컬럼을 event_time으로 표시하면, 다른 도구가 메타데이터를 사용할 때 컬럼의 의미론적 의미에서 벗어나 사용자 혼란을 일으킬 수 있어요.

하지만 수집 날짜(loaded_at, ingested_at, last_updated_at 등)만 사용하는 타임스탬프라면 event_time을 이 필드들로 설정할 수 있어요. 이렇게 할 때 유의할 점은:

  • last_updated_at 또는 loaded_at 사용 — 여러 번의 실행에 걸쳐 데이터 웨어하우스의 결과 테이블에 중복 항목이 생길 수 있어요. 적절한 lookback 값을 설정하면 중복을 줄일 수 있지만, lookback 창 밖의 일부 업데이트는 처리되지 않기 때문에 완전히 없애지는 못해요.
  • ingested_at 사용 — 이 컬럼은 원본 소스가 아니라 수집/EL 도구가 만든 것이므로, 어떤 이유로 커넥터를 재동기화해야 할 때 값이 바뀌어요. 이는 데이터가 두 번째 날짜에 대해 다시 처리되고 웨어하우스에 두 번째로 로드된다는 뜻이에요. 이런 일이 발생하지 않는다면(또는 발생할 때 full refresh를 실행한다면) ingested_at을 사용할 때 마이크로배치가 올바르게 처리돼요.

권장 및 비권장 event_time 컬럼 예시:

상태 컬럼 이름 설명
✅ 권장 account_created_at 계정이 생성된 특정 시각을 나타내므로, 시간상 고정된 이벤트가 돼요.
✅ 권장 session_began_at 사용자 세션이 시작된 정확한 타임스탬프를 담아요. 바뀌지 않고 이벤트에 직접 연결돼요.
❌ 비권장 _fivetran_synced 이벤트가 발생한 시각이 아니라 수집된 시각을 나타내요.
❌ 비권장 last_updated_at 시간이 지나며 바뀌고 이벤트 자체와 연결되지 않아요. 사용한다면 best practices에서 앞서 언급한 고려 사항에 유의하세요.

예제 (Examples)

모델 (Models)

dbt_project.yml 파일의 예시:

dbt_project.yml

models:
  my_project:
    user_sessions:
      +event_time: session_start_time

property 파일의 예시:

models/properties.yml

models:
  - name: user_sessions
    config:
      event_time: session_start_time

모델의 config 블록 예시:

models/user_sessions.sql

{{ config(
    event_time='session_start_time'
) }}

이 설정은 user_sessions 모델의 event_time으로 session_start_time을 지정해요.

Seeds

dbt_project.yml 파일의 예시:

dbt_project.yml

seeds:
  my_project:
    my_seed:
      +event_time: record_timestamp

seed properties YAML의 예시:

seeds/properties.yml

seeds:
  - name: my_seed
    config:
      event_time: record_timestamp

이 설정은 my_seedevent_time으로 record_timestamp를 지정해요.

Snapshots

dbt_project.yml 파일의 예시:

dbt_project.yml

snapshots:
  my_project:
    my_snapshot:
      +event_time: record_timestamp

snapshot properties YAML의 예시:

my_project/properties.yml

snapshots:
  - name: my_snapshot
    config:
      event_time: record_timestamp

이 설정은 my_snapshotevent_time으로 record_timestamp를 지정해요.

Sources

source property 파일의 예시:

models/properties.yml

sources:
  - name: source_name
    tables:
      - name: table_name
        config:
          event_time: event_timestamp

이 설정은 지정한 source 테이블의 event_time으로 event_timestamp를 지정해요.

더 알아보기 (Learn more)