구체화된 뷰는 미리 계산된 결과를 쿼리에 사용할 수 있으며, 입력의 변경 사항을 반영하도록 업데이트할 수 있는 뷰입니다. 구체화된 뷰는 파이프라인에서 지원됩니다. 구체화된 뷰가 업데이트될 때마다 업스트림 데이터 세트의 변경 내용을 반영하도록 쿼리 결과가 다시 계산됩니다. 구체화된 보기를 수동으로 또는 일정에 따라 업데이트할 수 있습니다.
업데이트를 수행하거나 예약하는 방법에 대한 자세한 내용은 파이프라인 업데이트 실행을 참조하세요.
Syntax
CREATE [OR REFRESH] [PRIVATE] MATERIALIZED VIEW
view_name
[ column_list ]
[ view_clauses ]
AS query
column_list
( { column_name column_type column_properties } [, ...]
[ column_constraint ] [, ...]
[ , table_constraint ] [...] )
column_properties
{ NOT NULL | COMMENT column_comment | column_constraint | MASK clause } [ ... ]
view_clauses
{ USING DELTA |
PARTITIONED BY (col [, ...]) |
CLUSTER BY clause |
LOCATION path |
COMMENT view_comment |
TBLPROPERTIES clause |
WITH { ROW FILTER clause } } [...]
매개 변수
REFRESH
지정한 경우 뷰를 만들거나 기존 보기와 해당 콘텐츠를 업데이트합니다.
개인
구체화된 프라이빗 뷰를 만듭니다. 구체화된 프라이빗 뷰는 카탈로그에 게시하지 않으려는 파이프라인 내의 중간 테이블로 유용할 수 있습니다.
- 카탈로그에 추가되지 않으며 정의 파이프라인 내에서만 액세스할 수 있습니다.
- 카탈로그의 기존 개체와 동일한 이름을 가질 수 있습니다. 파이프라인 내에서 프라이빗 구체화된 뷰와 카탈로그의 개체가 동일한 이름을 가지고 있으면, 그 이름에 대한 참조는 프라이빗 구체화된 뷰로 귀결됩니다.
- 프라이빗 구체화된 뷰는 단일 업데이트가 아니라 파이프라인의 수명 동안만 유지됩니다.
이전에
TEMPORARY매개 변수를 사용하여 프라이빗 구체화 뷰를 만들었습니다.view_name
새로 만들어진 뷰의 이름입니다. 완전히 한정된 뷰 이름은 고유해야 합니다.
구체화된 프라이빗 뷰는 카탈로그에 게시된 개체와 동일한 이름을 가질 수 있습니다.
column_list
필요에 따라 뷰의 쿼리 결과에서 열에 레이블을 지정합니다. 열 목록을 제공하는 경우 열 별칭 수는 쿼리의 식 수와 일치해야 합니다. 열 목록을 지정하지 않으면 별칭이 뷰 본문에서 파생됩니다.
-
열 이름은 고유해야 하며 쿼리의 출력 열에 매핑되어야 합니다.
열_유형
열의 데이터 형식을 지정합니다. Azure Databricks에서 지원하는 모든 데이터 형식이 구체화된 뷰에서 지원되는 것은 아닙니다.
column_comment
선택적인
STRING리터럴로 열을 설명합니다. 이 옵션은column_type과 함께 지정해야 합니다. 열 형식이 지정되지 않으면 열 주석은 생략됩니다.-
테이블로 이동하는 데이터의 유효성을 검사하는 제약 조건을 추가합니다. 파이프라인 기대를 사용하여 데이터 품질을 관리하기를 참조하세요.
-
중요합니다
이 기능은 공개 미리보기 단계에 있습니다.
열 마스크 함수를 추가하여 중요한 데이터를 익명화합니다. 행 필터 및 열 마스크를 참조하세요.
-
테이블 제약조건
중요합니다
이 기능은 공개 미리보기 단계에 있습니다.
스키마를 지정할 때 기본 키와 외장 키를 정의할 수 있습니다. 이러한 제약 조건은 정보 제공용일 뿐이며 적용되지 않습니다. SQL 언어 참조의 CONSTRAINT 절 참조하세요.
비고
테이블 제약 조건을 정의하려면 파이프라인이 Unity 카탈로그 사용 파이프라인이어야 합니다.
view_clauses
필요에 따라 구체화된 뷰에 대한 분할, 주석 및 사용자 정의 속성을 지정합니다. 각 하위 절은 한 번만 지정할 수 있습니다.
DELTA 사용
데이터 형식을 지정합니다. 유일한 옵션은 DELTA입니다.
이 절은 선택 사항이며 기본적으로 DELTA로 설정됩니다.
기준으로 분할됨
테이블의 분할에 사용할 하나 이상의 열의 선택적 목록입니다.
CLUSTER BY와 상호 배타적입니다.Liquid 클러스터링에서는 클러스터링을 위한 유연하고 최적화된 솔루션을 제공합니다.
CLUSTER BY대신PARTITIONED BY사용하는 것을 고려하세요.CLUSTER BY
테이블에서 액체 클러스터링을 사용하도록 설정하고 클러스터링 키로 사용할 열을 정의합니다. 자동 액체 클러스터링을
CLUSTER BY AUTO사용하고 Databricks는 클러스터링 키를 지능적으로 선택하여 쿼리 성능을 최적화합니다.PARTITIONED BY와 상호 배타적입니다.위치
테이블 데이터의 선택적 스토리지 위치입니다. 설정하지 않으면 시스템은 기본적으로 파이프라인 스토리지 위치로 설정됩니다.
이 옵션은 Hive 메타스토어에 게시할 때만 사용할 수 있습니다. Unity 카탈로그에서 위치는 자동으로 관리됩니다.
주석
테이블에 대한 선택적 설명입니다.
TBLPROPERTIES
테이블을 위한 테이블 속성의 선택적 목록입니다.
와 함께 ROW FILTER
중요합니다
이 기능은 공개 미리보기 단계에 있습니다.
테이블에 행 필터 함수를 추가합니다. 해당 테이블에 대한 이후 쿼리는 함수가 TRUE로 평가되는 행의 하위 집합을 받습니다. 이는 함수가 호출하는 사용자의 ID 및 그룹 멤버 자격을 검사하여 특정 행을 필터링할지 여부를 결정할 수 있으므로 세분화된 액세스 제어에 유용합니다.
ROW FILTER조항참조하세요.쿼리
테이블의 데이터 세트를 정의하는 쿼리입니다.
필요한 권한
파이프라인에 대한 실행 사용자에게는 다음 권한이 있어야 합니다.
-
SELECT구체화된 뷰에서 참조하는 기본 테이블에 대한 권한입니다. - 부모 카탈로그에는
USE CATALOG권한이, 부모 스키마에는USE SCHEMA권한이 필요합니다. -
CREATE MATERIALIZED VIEW구체화된 뷰의 스키마에 대한 권한입니다.
사용자가 구체화된 뷰가 정의된 파이프라인을 업데이트하려면 다음이 필요합니다.
- 부모 카탈로그에는
USE CATALOG권한이, 부모 스키마에는USE SCHEMA권한이 필요합니다. - 구체화된 뷰에 대한 소유권 또는
REFRESH권한. - 구체화된 뷰의 소유자는 구체화된 뷰에서
SELECT참조하는 기본 테이블에 대한 권한이 있어야 합니다.
사용자가 결과 구체화된 뷰를 쿼리하려면 다음이 필요합니다.
- 부모 카탈로그에는
USE CATALOG권한이, 부모 스키마에는USE SCHEMA권한이 필요합니다. - 구체화된 뷰에 대한
SELECT권한.
제한점
- NULL이 가능한 열에 대한 집계가 포함된
sum구체화된 뷰에서, 그 열의 NULL이 아닌 마지막 값이 제거되어NULL값만 남아 있는 상황에서, 구체화된 뷰의 결과 집계 값은NULL대신 0을 반환합니다. - 열 참조에는 별칭이 필요하지 않습니다. 다음 예제와 같이 열이 아닌 참조 식에는 별칭이 필요합니다.
- 허용됨:
SELECT col1, SUM(col2) AS sum_col2 FROM t GROUP BY col1 - 허용되지 않음:
SELECT col1, SUM(col2) FROM t GROUP BY col1
- 허용됨:
- 유효한 문이 되려면
NOT NULL을PRIMARY KEY와 함께 수동으로 지정해야 합니다. - 구체화된 뷰는 ID 열 또는 서로게이트 키를 지원하지 않습니다.
- 구체화된 뷰는
OPTIMIZE및VACUUM명령을 지원하지 않습니다. 유지 관리는 자동으로 수행됩니다. - 테이블 이름을 바꾸거나 소유자를 변경하는 것은 지원되지 않습니다.
- 생성된 열, ID 열 및 기본 열은 지원되지 않습니다.
예시
-- Create a materialized view by reading from an external data source, using the default schema:
CREATE OR REFRESH MATERIALIZED VIEW taxi_raw
AS SELECT * FROM read_files("/databricks-datasets/nyctaxi/sample/json/")
-- Create a materialized view by reading from a dataset defined in a pipeline:
CREATE OR REFRESH MATERIALIZED VIEW filtered_data
AS SELECT
...
FROM taxi_raw
-- Specify a schema and clustering columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
customer_name STRING,
number_of_line_items STRING,
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) CLUSTER BY (order_day_of_week, customer_id)
COMMENT "Raw data on sales"
AS SELECT * FROM ...
-- Specify partition columns for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING,
customer_name STRING,
number_of_line_items STRING,
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
) PARTITIONED BY (order_day_of_week)
COMMENT "Raw data on sales"
AS SELECT * FROM ...
-- Specify a primary and foreign key constraint for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales
(customer_id STRING NOT NULL PRIMARY KEY,
customer_name STRING,
number_of_line_items STRING,
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime)),
CONSTRAINT fk_customer_id FOREIGN KEY (customer_id) REFERENCES main.default.customers(customer_id)
)
COMMENT "Raw data on sales"
AS SELECT * FROM ...
-- Specify a row filter and mask clause for a table:
CREATE OR REFRESH MATERIALIZED VIEW sales (
customer_id STRING MASK catalog.schema.customer_id_mask_fn,
customer_name STRING,
number_of_line_items STRING COMMENT 'Number of items in the order',
order_datetime STRING,
order_number LONG,
order_day_of_week STRING GENERATED ALWAYS AS (dayofweek(order_datetime))
)
COMMENT "Raw data on sales"
WITH ROW FILTER catalog.schema.order_number_filter_fn ON (order_number)
AS SELECT * FROM sales_bronze