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_time은 incremental 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_seed의 event_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_snapshot의 event_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를 지정해요.