구체화된 뷰는 미리 계산된 결과를 쿼리에 사용할 수 있으며, 입력의 변경 사항을 반영하도록 업데이트할 수 있는 뷰입니다. 구체화된 뷰는 Lakeflow 선언적 파이프라인에서 지원됩니다. 구체화된 뷰가 업데이트될 때마다 업스트림 데이터 세트의 변경 내용을 반영하도록 쿼리 결과가 다시 계산됩니다. 구체화된 보기를 수동으로 또는 일정에 따라 업데이트할 수 있습니다.
업데이트를 수행하거나 예약하는 방법에 대한 자세한 내용은 Lakeflow 선언적 파이프라인에서 업데이트 실행을 참조하세요.
문법
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 클러스터링에서는 클러스터링을 위한 유연하고 최적화된 솔루션을 제공합니다. Lakeflow 선언적 파이프라인에
CLUSTER BY
대신PARTITIONED BY
을 사용하는 것이 좋습니다.CLUSTER BY
테이블에서 액체 클러스터링을 사용하도록 설정하고 클러스터링 키로 사용할 열을 정의합니다.
PARTITIONED BY
와 상호 배타적입니다.위치
테이블 데이터의 선택적 스토리지 위치입니다. 설정하지 않으면 시스템은 기본적으로 파이프라인 스토리지 위치로 설정됩니다.
이 옵션은 Hive 메타스토어에 게시할 때만 사용할 수 있습니다. Unity 카탈로그에서 위치는 자동으로 관리됩니다.
주석
테이블에 대한 선택적 설명입니다.
TBLPROPERTIES
테이블을 위한 테이블 속성의 선택적 목록입니다.
와 함께 ROW FILTER
중요합니다
이 기능은 공개 미리보기 단계에 있습니다.
테이블에 행 필터 함수를 추가합니다. 해당 테이블에 대한 이후 쿼리는 함수가 TRUE로 평가되는 행의 하위 집합을 받습니다. 이는 함수가 호출하는 사용자의 ID 및 그룹 멤버 자격을 검사하여 특정 행을 필터링할지 여부를 결정할 수 있으므로 세분화된 액세스 제어에 유용합니다.
ROW FILTER
조항참조하세요.쿼리
테이블의 데이터 세트를 정의하는 Lakeflow 선언적 파이프라인 쿼리입니다.
필요한 권한
파이프라인에 대한 실행 사용자에게는 다음 권한이 있어야 합니다.
-
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