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"
}
}