오늘 배운 것🤓
PK Uniqueness 보장
PK (Primary Key)
- 테이블에서 하나의 레코드를 유일하기 지칭할 수 있는 필드(들)
- 하나의 필드가 일반적이지만 다수의 필드 사용 가능
- 다수의 필드를 PK로 사용할 경우 일부 필드는 FK일 수도 있다.
- 하지만 Data Warehouse는 PK를 지켜주지 않는다.
(Why? 보정하는데 메모리와 시간이 더 들기 때문에 대용량 데이터의 적재에 걸림돌이 된다.)
=> 이를 보장하도록 하는 것이 데이터 인력의 책임!!!
PK 유지 방법
- PK 설정한 field가 중복이 된다면
created_date
를 정렬하여 더 최신의 값을 유지한다.
(이는 날씨 예보와 같은 최신의 값이 더 정확할 경우 사용하고 각각의 케이스에 맞춰서 유지 기준을 세우자.)
ROW_NUMBER() OVER (partition by 그룹기준필드명 order by 정렬기준필드명 DESC) AS seq
- 임시 테이블을 만들고 원본 테이블을 복사한다.
- 임시 테이블에 새로운 레코드를 적재한다.
- 중복을 걸러주기 위해 위의 SQL을 활용한다.
- 최신 레코드를 우선순위로 선택
ROW_NUMBER
를 사용하여 PK별로 하나의 레코드를 생성한다.
- 원본 테이블의 레코드를 먼저 삭제한 후, 1~3을 통해 만들어진 레코드를 원본 테이블로 복사한다.
- 1~3번의 임시 테이블을 임시로 사용하고 자동으로 지워지기 때문에 transaction으로 감쌀 필요가 없지만 4번은 원본 테이블을 삭제하고 삽입하는 과정이므로 transaction으로 꼭! 감싸줘야 한다.
Upsert
위의 과정을 지징하는 말로써, Update + Insert의 합성어이다. 존재하는 레코드라면 새로운 정보로 수정하고, 존재하지 않는 레코드라면 새로운 레코드로 적재한다.
보통 data warehouse마다 Upsert를 효율적으로 해주는 문법을 지원한다.
Backfill
- 한국말로 하면 '되메우기질을 하다'라는 뜻으로, airflow에서는 에러가 나서 비워진 공간을 채우기 위한 작업을 말한다.
- Incremental Update 시에만 의미가 있다.
- Full Refresh의 경우 어차피 다시 받으면 처음부터 끝까지 받아지기 때문이다.)
- 효율성이 더 좋을 수 있지만 운영/유지 보수의 난이도가 올라가기 때문에 웬만하면 full refresh를 사용하도록 하자.
- 과거 데이터를 모두 다시 읽어와야하는 경우 그 날짜를 모두 재실행해야 한다.
- Backfill이 유연하고 편할 수록 데이터 엔지니어 삶에 행복도가 바뀌기 때문에 실패한 데이터 파이프라인의 재실행이 얼마나 용이한 구조인가?에 대해 항상 고민해야 한다.
ETL을 어떻게 구현해야할까?
- 날짜 별로 backfill 결과를 기록하고 성공 여부의 기록을 남긴다.
-> 나중에 결과를 쉽게 확인할 수 있다.
- 이 날짜를 시스템에서 자동으로 ETL 인자로 제공하도록 하자.
- 읽어와야 하는 데이터의 날짜를 계산하는 것이 아니라, 시스템이 지정해준 날짜를 이용하자.
위의 내용이 Airflow에는 이미 구현이 되어있다. 위의 이유로 Airflow가 중요한 것이다!
- ETL별로 실행날짜와 결과를 메타 DB에 기록한다.
- 모든 DAG 실행에는 "execution_date"가 지정되어 있다.
- "execution_date"로 채워야하는 날짜와 시간이 넘어온다.
-> 데이터를 갱신하도록 코드를 작성해야 한다.
Airflow 변수
start_date
- DAG가 처음 읽어와야 하는 데이터의 날짜/시간
- 실제 첫 실행 날짜는
start_date
+DAG의 실행 주기
execution_date
catchup
- DAG가 처음 활성화된 시점이
start_date
보다 미래라면 그 사이에 생긴 공백을 메꿀지 무시할지 결정하는 인자
- True : 비어있는 시간을 따라잡는다.(default)
- False : 비어있는 시간을 무시한다.
end_date
- optional한 기능이므로 보통 필요 X
- Backfill을 날짜 범위에 대해 지정해야할만 사용
airflow dags backfill -s 시작날짜 -e 종료날짜
느낀 점😊
수업이 어려운 것이 아니라 예기치못했던 에러가 제일 어려웠다. 3일동안 고민했다... docker-compose.yaml
을 수정했으면 다시 한번더 up
을 해주자... 업...어업...업....