적용 대상: Databricks SQL
Databricks Runtime
yaml 사양에 따라 SQL 쿼리 또는 메트릭 뷰의 결과 집합을 기반으로 실제 데이터가 없는 가상 테이블을 생성합니다. ALTER VIEW 및 DROP VIEW는 메타데이터만 변경합니다.
이 문을 실행하려면 메타스토어 관리자 USE CATALOG
이거나 카탈로그 및 스키마에 대한 권한과 USE SCHEMA
대상 스키마 CREATE TABLE
의 권한이 있어야 합니다.
이 명령을 실행하는 사용자는 보기의 소유자가 됩니다.
구문
CREATE [ OR REPLACE ] [ TEMPORARY ] VIEW [ IF NOT EXISTS ] view_name
[ column_list ]
[ with_clause |
COMMENT view_comment |
DEFAULT COLLATION collation_name |
TBLPROPERTIES clause |
LANGUAGE YAML ] [...]
AS { query | $$ yaml_string $$ }
with_clause
WITH { { schema_binding | METRICS } |
( { schema_binding | METRICS } [, ...] } )
schema_binding
WITH SCHEMA { BINDING | COMPENSATION | [ TYPE ] EVOLUTION }
column_list
( { column_alias [ COMMENT column_comment ] } [, ...] )
매개 변수
또는 교체
같은 이름의 뷰가 이미 있는 경우, 그것이 대체됩니다. 기존의 뷰를 바꾸려면 소유자여야 합니다.
기존 보기를 바꿔도 원래 보기 또는
table_id
에 부여된 권한은 유지되지 않습니다. ALTER VIEW 사용하여 권한을 유지합니다.CREATE OR REPLACE VIEW view_name
는DROP VIEW IF EXISTS view_name
뒤에CREATE VIEW view_name
가 오는 것과 동일합니다.임시
TEMPORARY
뷰는 뷰를 만든 세션에만 표시되며 세션이 종료되면 삭제됩니다.글로벌 임시
적용 대상:
Databricks 런타임
GLOBAL TEMPORARY
뷰는 시스템 보존 임시 스키마global_temp
에 연결됩니다.존재하지 않을 경우
존재하지 않는 경우에만 뷰를 작성합니다. 이 이름의 뷰가 이미 있는 경우
CREATE VIEW
문은 무시됩니다.IF NOT EXISTS
또는OR REPLACE
중 최대 하나를 지정할 수 있습니다.-
새로 만들어진 뷰의 이름입니다. 임시 뷰의 이름은 정규화되어서는 안 됩니다. 정규화된 뷰 이름은 고유해야 합니다.
만든
hive_metastore
보기 이름에는 영숫자 ASCII 문자와 밑줄(INVALID_SCHEMA_OR_RELATION_NAME)만 포함될 수 있습니다. 측정지표
적용 대상:
Databricks SQL
Databricks Runtime 16.4 이상
Unity Catalog 전용
뷰를 메트릭 뷰로 식별합니다. 뷰를 정의
LANGUAGE YAML
해야 하며 뷰 본문은 유효한 yaml 사양이어야 합니다.이 문구는 임시 뷰에서는 지원되지 않습니다.
메트릭 뷰는
DEFAULT COLLATION
및schema_binding
절을 지원하지 않습니다.메트릭 뷰의 YAML 사양은
dimensions
와measures
을 정의합니다.dimensions
는 호출자가 측정값을 집계할 수 있는 뷰의 열인 반면,measures
는 뷰의 집계를 정의합니다.메트릭 뷰의 호출자는 집계 함수를 지정하는 대신 측정값 식을 사용하여 정의된 뷰 측정값에 액세스합니다.
schema_binding
적용 대상:
Databricks Runtime 15.3 이상
필요에 따라 기본 개체 정의의 변경으로 인해 뷰가 쿼리의 스키마 변경 내용에 맞게 조정되는 방식을 지정합니다.
임시 뷰, 메트릭 뷰 또는 구체화된 뷰에는 이 절이 지원되지 않습니다.
SCHEMA 제본
다음 조건을 제외하고 쿼리 열 목록이 변경되면 보기가 유효하지 않습니다.
- 열 목록에는 별 절이 포함되며 추가 열이 있습니다. 이러한 추가 열은 무시됩니다.
- 하나 이상의 열 형식이 암시적 캐스팅 규칙을 사용하여 원래 열 형식으로 안전하게 캐스팅되도록 하는 방식으로 변경되었습니다.
이 옵션은 기본 동작입니다.
SCHEMA 보상
다음 조건을 제외하고 쿼리 열 목록이 변경되면 보기가 유효하지 않습니다.
- 열 목록에는 별 절이 포함되며 추가 열이 있습니다. 이러한 추가 열은 무시됩니다.
- 하나 이상의 열 형식이 명시적 ANSI 캐스트 규칙을 사용하여 원래 열 형식으로 캐스팅될 수 있는 방식으로 변경되었습니다.
SCHEMA 형식 진화
이 뷰는 SQL 컴파일러가 뷰에 대한 참조에 대한 응답으로 이러한 변경 내용을 감지할 때 쿼리 열 목록의 형식에 대한 변경 내용을 자체 정의로 채택합니다.
SCHEMA 진화
- 이 모드는
SCHEMA TYPE EVOLUTION
처럼 작동하며, 보기에서 명시적으로column_list
이 포함되지 않은 경우 열 이름의 변경, 추가된 열 및 삭제된 열을 채택합니다. - 쿼리를 더 이상 구문 분석할 수 없거나, 선택적 뷰
column_list
가 더 이상query
선택 목록의 식 수와 일치하지 않는 경우에만 보기가 무효가 됩니다.
- 이 모드는
column_list
필요에 따라 뷰의 쿼리 결과에서 열에 레이블을 지정합니다. 열 목록을 제공하는 경우 열 별칭 수가 쿼리의 식 수 또는 메트릭 뷰의 경우 YAML 사양과 일치해야 합니다. 열 목록이 지정되지 않은 경우 뷰 본문에서 별칭이 파생됩니다.
-
열 별칭은 고유해야 합니다.
column_comment
선택적인 열 별칭 설명용
STRING
리터럴입니다.
-
view_comment
뷰 수준 주석을 제공하는 선택적
STRING
리터럴입니다.기본 데이터 정렬 collation_name
적용 대상:
Databricks SQL
Databricks Runtime 16.3 이상
query
내에서 사용할 기본 데이터 정렬을 정의합니다. 지정하지 않으면 기본 데이터 정렬은 뷰가 만들어지는 스키마에서 파생됩니다.메트릭 뷰에는 이 절이 지원되지 않습니다.
-
선택적으로 하나 이상의 사용자 정의 속성을 설정합니다.
AS 쿼리
기본 테이블 또는 다른 뷰에서 뷰를 생성하는 쿼리입니다.
메트릭 뷰에는 이 절이 지원되지 않습니다.
AS $$ yaml_string $$
메트릭 뷰를 정의하는 yaml 사양입니다.
예제
-- Create or replace view for `experienced_employee` with comments.
> CREATE OR REPLACE VIEW experienced_employee
(id COMMENT 'Unique identification number', Name)
COMMENT 'View for experienced employees'
AS SELECT id, name
FROM all_employee
WHERE working_years > 5;
-- Create a temporary view `subscribed_movies`.
> CREATE TEMPORARY VIEW subscribed_movies
AS SELECT mo.member_id, mb.full_name, mo.movie_title
FROM movies AS mo
INNER JOIN members AS mb
ON mo.member_id = mb.id;
-- Create a view with schema binding (default)
> CREATE TABLE emp(name STRING, income INT);
> CREATE VIEW emp_v WITH SCHEMA BINDING AS SELECT * FROM emp;
– The view ignores adding a column to the base table
> ALTER TABLE emp ADD COLUMN bonus SMALLINT;
> SELECT * FROM emp_v;
name income
---- ------
-- The view tolerates narrowing the underlying type
> CREATE OR REPLACE TABLE emp(name STRING, income SMALLINT, bonus SMALLINT);
> SELECT typeof(income) FROM emp_v;
INTEGER
– The view does not tolerate widening the underlying type
CREATE OR REPLACE TABLE emp(name STRING, income BIGINT, bonus SMALLINT);
> SELECT typeof(income) FROM emp_v;
Error
– Create a view with SCHEMA COMPENSATION
> CREATE TABLE emp(name STRING, income SMALLINT, bonus SMALLINT);
> CREATE VIEW emp_v WITH SCHEMA COMPENSATION AS SELECT * FROM emp;
-- The view tolerates widening the underlying type but keeps its own signature fixed
CREATE OR REPLACE TABLE emp(name STRING, income INTEGER, bonus INTEGER);
> SELECT typeof(income) FROM emp_v;
INTEGER
-- The view does not tolerate dropping a needed column
ALTER TABLE emp DROP COLUMN bonus;
> SELECT * FROM emp_v;
Error
– Create a view with SCHEMA EVOLUTION
> CREATE TABLE emp(name STRING, income SMALLINT);
> CREATE VIEW emp_v WITH SCHEMA EVOLUTION AS SELECT * FROM emp;
-- The view picks up additional columns
> ALTER TABLE emp ADD COLUMN bonus SMALLINT
> SELECT * FROM emp_v;
name income bonus
---- ------ -----
-- The view picks up renamed columns as well
> ALTER TABLE emp RENAME COLUMN income TO salary SMALLINT;
> SELECT * FROM emp_v;
name salary bonus
---- ------ -----
-- The view picks up changes to column types and dropped columns
> CREATE OR REPLACE TABLE emp(name STRING, salary BIGINT);
> SELECT *, typeof(salary)AS salary_type FROM emp_v;
name salary
---- ------
-- Create a view using a default collation of UTF8_BINARY
> CREATE VIEW v DEFAULT COLLATION UTF8_BINARY
AS SELECT 5::STRING AS text;
-- Creates a Metric View as specified in the YAML definition, with three dimensions and four measures representing the count of orders.
> CREATE OR REPLACE VIEW region_sales_metrics
(month COMMENT 'Month order was made',
status,
order_priority,
count_orders COMMENT 'Count of orders',
total_Revenue,
total_revenue_per_customer,
total_revenue_for_open_orders)
WITH METRICS
LANGUAGE YAML
COMMENT 'A Metric View for regional sales metrics.'
AS $$
version: 0.1
source: samples.tpch.orders
filter: o_orderdate > '1990-01-01'
dimensions:
- name: month
expr: date_trunc('MONTH', o_orderdate)
- name: status
expr: case
when o_orderstatus = 'O' then 'Open'
when o_orderstatus = 'P' then 'Processing'
when o_orderstatus = 'F' then 'Fulfilled'
end
- name: prder_priority
expr: split(o_orderpriority, '-')[1]
measures:
- name: count_orders
expr: count(1)
- name: total_revenue
expr: SUM(o_totalprice)
- name: total_revenue_per_customer
expr: SUM(o_totalprice) / count(distinct o_custkey)
- name: total_revenue_for_open_orders
expr: SUM(o_totalprice) filter (where o_orderstatus='O')
$$;
> DESCRIBE EXTENDED region_sales_metrics;
col_name data_type
------------------------------ --------------------------
month timestamp
status string
order_priority string
count_orders bigint measure
total_revenue decimal(28,2) measure
total_revenue_per_customer decimal(38,12) measure
total_revenue_for_open_orders decimal(28,2) measure
# Detailed Table Information
Catalog main
Database default
Table region_sales_metrics
Owner alf@melmak.et
Created Time Thu May 15 13:03:01 UTC 2025
Last Access UNKNOWN
Created By Spark
Type METRIC_VIEW
Comment A Metric View for regional sales metrics.
Use Remote Filtering false
View Text "
version: 0.1
source: samples.tpch.orders
filter: o_orderdate > '1990-01-01'
dimensions:
- name: month
expr: date_trunc('MONTH', o_orderdate)
- name: status
expr: case
when o_orderstatus = 'O' then 'Open'
when o_orderstatus = 'P' then 'Processing'
when o_orderstatus = 'F' then 'Fulfilled'
end
- name: Order_Priority
expr: split(o_orderpriority, '-')[1]
measures:
- name: count_orders
expr: count(1)
- name: total_Revenue
expr: SUM(o_totalprice)
- name: total_Revenue_per_Customer
expr: SUM(o_totalprice) / count(distinct o_custkey)
- name: Total_Revenue_for_Open_Orders
expr: SUM(o_totalprice) filter (where o_orderstatus='O')
"
Language YAML
Table Properties [metric_view.from.name=samples.tpch.orders, metric_view.from.type=ASSET, metric_view.where=o_orderdate > '1990-01-01']
-- Tracking total_revenue_per_customer by month in 1995
> SELECT extract(month from month) as month,
measure(total_revenue_per_customer)::bigint AS total_revenue_per_customer
FROM region_sales_metrics
WHERE extract(year FROM month) = 1995
GROUP BY ALL
ORDER BY ALL;
month total_revenue_per_customer
----- --------------------------
1 167727
2 166237
3 167349
4 167604
5 166483
6 167402
7 167272
8 167435
9 166633
10 167441
11 167286
12 167542
-- Tracking total_revenue_per_customer by month and status in 1995
> SELECT extract(month from month) as month,
status,
measure(total_revenue_per_customer)::bigint AS total_revenue_per_customer
FROM region_sales_metrics
WHERE extract(year FROM month) = 1995
GROUP BY ALL
ORDER BY ALL;
month status total_revenue_per_customer
----- --------- --------------------------
1 Fulfilled 167727
2 Fulfilled 161720
2 Open 40203
2 Processing 193412
3 Fulfilled 121816
3 Open 52424
3 Processing 196304
4 Fulfilled 80405
4 Open 75630
4 Processing 196136
5 Fulfilled 53460
5 Open 115344
5 Processing 196147
6 Fulfilled 42479
6 Open 160390
6 Processing 193461
7 Open 167272
8 Open 167435
9 Open 166633
10 Open 167441
11 Open 167286
12 Open 167542