집합 연산자

집합 연산자 (Set operators)

셀렉터 표현식을 --select--exclude의 여러 인자로 나열하면 합집합(union)과 교집합(intersection)으로 결합해요. 공백은 합집합, 공백 없는 쉼표는 교집합을 의미해요. 이를 조합해 복잡한 선택을 한 명령으로 만드는 방법을 다뤄요.

출처: 문서

본문

셀렉터 표현식을 --select--exclude의 여러 인자로 나열하면 합집합(union)과 교집합(intersection)으로 결합해요. 셀렉터 표현식은 프로젝트의 노드(모델, 테스트, 시드, 기타 리소스 유형) 하위 집합을 정의해 전체 DAG를 실행하지 않아도 되게 해줘요. 전체 선택 언어와 selectors.yml의 명명된 셀렉터는 Syntax overview와 YAML selectors를 참고하세요.

합집합 (Unions)

합집합은 여러 셀렉터 표현식의 노드 집합을 병합해요. 그 표현식 중 하나라도 일치하는 모든 리소스가 선택돼요. 즉, 합집합은 --select--exclude에 전달하는 인자들에 대한 OR처럼 동작해요.

합집합에서는 공백으로 구분된(space-delimited) 여러 인자를 전달할 수 있어요. dbt는 각 인자를 일반적인 선택 규칙(선택 메서드, 그래프 연산자, 기타 선택 문법)으로 해석한 다음 결과를 결합해요. 둘 이상의 인자가 같은 노드와 일치하면 그 노드는 최종 선택에 한 번만 나타나요.

예를 들어 아래 명령은 두 개의 셀렉터 표현식을 결합해요. 각각 +를 사용해 모델과 그 조상을 포함하며, 그 사이의 공백이 두 집합을 병합해요:

dbt run --select "+snowplow_sessions +fct_orders"

이 동작은 교집합과 다르며, 교집합에서는 공백 없는 쉼표로 구분된 인자가 리소스가 모든 기준을 동시에 충족하도록 요구해요.

교집합 (Intersections)

교집합은 모든 셀렉터 표현식과 일치하는 노드만 유지해요. 최종 집합에 남으려면 리소스는 모든 쉼표로 구분된 인자를 충족해야 해요.

--select--exclude에 여러 인자를 전달할 때 인자 사이에 공백 없는 쉼표를 사용해 교집합을 정의해요. 인자 사이의 공백은 여전히 합집합을 의미해요. dbt는 각 인자를 일반적인 선택 규칙(선택 메서드, 그래프 연산자, 기타 선택 문법)으로 해석한 다음 모든 것을 충족하는 리소스만 유지해요. 쉼표로 구분된 인자의 순서는 최종 집합을 바꾸지 않아요.

다음 예시들은 교집합을 보여줘요:

공유되는 업스트림 노드 선택(snowplow_sessions와 fct_orders의 공통 조상):

dbt run --select "+snowplow_sessions,+fct_orders"

공유되는 다운스트림 노드 선택(stg_invoices와 stg_accounts의 공통 후손):

dbt run --select "stg_invoices+,stg_accounts+"

marts/finance 경로 아래 있고 nightly 태그가 붙은 모델 선택:

dbt run --select "marts.finance,tag:nightly"

합집합과 교집합 결합 (Combining unions and intersections)

단일 --select--exclude 값에서 합집합과 교집합을 결합해 한 명령으로 복잡한 선택을 만들 수 있어요. dbt는 각 공백 구분 인자를 독립적으로 평가해요: 인자 안의 공백 없는 쉼표는 교집합을 정의하고, 인자 사이의 공백은 결과를 합집합으로 결합해요. 두 연산자를 결합하면 프로젝트의 다른 하위 집합에 다른 필터링 로직을 동시에 적용할 수 있어요.

예를 들어 아래 명령은 두 개의 공백 구분 인자를 포함하며, 각각 교집합을 정의해요:

  • +snowplow_sessions,+fct_orders는 snowplow_sessions와 fct_orders 둘 다의 업스트림인 노드를 선택해요.
  • marts.finance,tag:nightly는 marts/finance 경로 아래 있고 nightly 태그가 붙은 모델을 선택해요.

그 인자들 사이의 공백은 합집합을 만들어 두 결과를 하나의 선택으로 결합해요:

dbt run --select "+snowplow_sessions,+fct_orders marts.finance,tag:nightly"

더 알아보기 (Learn more)