dbt show 명령어

dbt show 명령어

dbt show는 단일 모델·테스트·분석 또는 --inline으로 전달한 임의 dbt-SQL 쿼리의 정의를 컴파일하고, 그 쿼리를 데이터 웨어하우스에 대해 실행한 뒤 결과를 터미널에 미리 보여줘요.

출처: 문서

본문

dbt show는 다음에 사용해요:

  • 단일 model, test, analysis 또는 --inline으로 전달한 임의 dbt-SQL 쿼리의 dbt-SQL 정의를 컴파일한다. dbt show는 Python(dbt-py) 모델을 지원하지 않아요. 단일 노드 선택만 지원돼요. 선택자 메서드, 그래프 연산자, 여러 노드를 선택하는 다른 메서드는 사용되지 않아요.
  • 그 쿼리를 데이터 웨어하우스에 대해 실행한다.
  • 터미널에서 결과를 미리 본다.

(dbt v2.0 이상 적용)

  • --info 플래그를 사용해 웨어하우스에 연결하지 않고 CLI에서 dbt Information Schema를 직접 쿼리한다.

동작 방식

기본적으로 dbt show는 쿼리 결과의 처음 5행을 표시해요. limit 또는 inline 플래그를 전달해 사용자 지정할 수 있으며, 여기서 n은 표시할 행 수예요.

모델을 미리 볼 때 dbt는 항상 소스에서 컴파일된 쿼리를 컴파일·실행해요. 방금 모델을 실행했다 해도 이미 구체화된 데이터베이스 관계에서 select하지 않아요. (향후 지원할 수 있어요. 관심이 있다면 dbt-labs/dbt#7391에 upvote하거나 코멘트를 남기세요.)

limit 플래그

  • --limit 플래그는 표시되는 행 수뿐 아니라 기본 SQL도 수정해요. --limit n 플래그를 쓰면 n이 데이터 웨어하우스에서 표시되고 가져오는 행 수라는 뜻이에요.
  • 즉 dbt가 모델의 쿼리를 서브쿼리나 CTE로 감싸고 SQL limit n 절을 적용해서, 데이터 웨어하우스가 그만큼만 처리·반환하게 하므로 대형 데이터셋에서 훨씬 빨라져요.

inline 플래그

  • 미리 보기 쿼리의 결과는 dbt의 로그에만 포함되고 터미널에 표시되며, 데이터 웨어하우스에 구체화되거나 어떤 dbt 파일에도 저장되지 않아요. 단, dbt show --inline을 사용하는 경우는 예외예요.
  • --inline 플래그는 임시(ad-hoc) SQL을 실행할 수 있게 하므로, dbt는 쿼리가 데이터 웨어하우스를 수정하지 않는지 보장할 수 없어요. 변경이 없도록 하려면 데이터 웨어하우스에서 직접 관리하는 읽기 전용 권한의 프로필이나 역할을 사용하세요. 예: dbt show --inline "select * from my_table" --profile my-read-only-profile.

(dbt v2.0 이상 적용)

--info 플래그

  • --info <view> 플래그는 CLI에서 dbt Information Schema를 직접 쿼리해요. 중간 뷰(intermediate views)에서 읽으며 웨어하우스에 연결하지 않아요.
  • --inline "select * from {{ info_schema('<view>') }}"와 동등해요.
dbt show --info models
dbt show --info models --limit 20

--inline을 사용해 Information Schema에 대한 커스텀 SQL을 작성할 수도 있어요:

dbt show --inline "select name from {{ info_schema('models') }} order by name"

--output json 플래그

--output json 플래그는 기본 인간이 읽을 수 있는 출력 대신 JSON 형식으로 dbt show 결과를 반환해요. 스크립팅·자동화에 유용해요. 전체 터미널 출력(로그 포함)을 머신 읽기 가능한 JSON으로 하려면 --log-format json도 설정할 수 있어요.

예시

dbt show --select "model_name.sql" 또는 dbt show --inline "select * from {{ ref('model_name') }}"stg_orders라는 모델에 대한 dbt show 출력 예시:

dbt show --select "stg_orders"
21:17:38  Running with dbt=1.5.0-b5
21:17:38  Found 5 models, 20 tests, 0 snapshots, 0 analyses, 425 macros, 0 operations, 3 seed files, 0 sources, 0 exposures, 0 metrics, 0 groups
21:17:38
21:17:38  Concurrency: 24 threads (target='dev')
21:17:38
21:17:38  Previewing node 'stg_orders' :
| order_id | customer_id | order_date | status    |
|----------+-------------+------------+--------  |
| 1        | 1           | 2023-01-01 | returned  |
| 2        | 3           | 2023-01-02 | completed |
| 3        | 94          | 2023-01-03 | completed |
| 4        | 50          | 2023-01-04 | completed |
| 5        | 64          | 2023-01-05 | completed |

예를 들어 방금 실패한 테스트가 있는 모델을 빌드했다면 터미널에서 빠르게 테스트 실패를 미리 봐서, 중복되는 id 값을 찾을 수 있어요:

$ dbt build -s "my_model_with_duplicates"
13:22:47  .0...
13:22:48  Completed with 1 error and 0 warnings:
13:22:48
13:22:48  Failure in test unique_my_model_with_duplicates (models/schema.yml)
13:22:48    Got 1 result, configured to fail if not 0
13:22:48
13:22:48    compiled code at target/compiled/my_dbt_project/models/schema.yml/unique_my_model_with_duplicates_id.sql
13:22:48
13:22:48  Done. PASS=1 WARN=0 ERROR=1 SKIP=0 TOTAL=2

$ dbt show -s "unique_my_model_with_duplicates_id"
13:22:53  Running with dbt=1.5.0
13:22:53  Found 4 models, 2 tests, 0 snapshots, 0 analyses, 309 macros, 0 operations, 0 seed files, 0 sources, 0 exposures, 0 metrics, 0 groups
13:22:53
13:22:53  Concurrency: 5 threads (target='dev')
13:22:53
13:22:53  Previewing node 'unique_my_model_with_duplicates_id':
| unique_field | n_records |
| ------------ | --------- |
| 1            | 2         |

dbt show --inline "select 1" --output json --log-format json은 다음과 같은 결과를 줘요:

{
  "data": {
    "is_inline": true,
    "node_name": "inline_query",
    "output_format": "json",
    "preview": "[{\"ID\": 1}]",
    "quiet": false,
    "unique_id": "sql_operation.jaffle_shop.inline_query"
  },
  "info": {
    "code": "Q041",
    "level": "info",
    "msg": "{\n \"show\": [\n {\n \"ID\": 1\n }\n ]\n}\n",
    "name": "ShowNode",
    "thread": "MainThread"
  }
}

더 알아보기 (Learn more)