Liquid Clustering은 테이블 분할 및 ZORDER.을 대체하는 데이터 레이아웃 최적화 기술입니다. 클러스터링 키를 기반으로 데이터를 자동으로 구성하여 테이블 관리를 간소화하고 쿼리 성능을 최적화합니다.
기존 분할과 달리 기존 데이터를 다시 작성하지 않고 클러스터링 키를 다시 정의할 수 있습니다. 이렇게 하면 변화하는 분석 요구 사항과 함께 데이터 레이아웃이 발전할 수 있습니다. Liquid 클러스터링이 스트리밍 테이블과 구체화된 뷰 모두에 적용됩니다.
Important
Liquid 클러스터링은 Databricks Runtime 15.4 LTS 이상에서 Delta Lake 테이블에 대해 정식으로 제공되며, Databricks Runtime 16.4 LTS 이상에서는 Apache Iceberg 테이블에 대해 공개 미리 보기로 제공됩니다. Databricks는 최상의 성능을 위해 최신 Databricks 런타임을 사용하는 것이 좋습니다.
관리형 Apache Iceberg v3 테이블은 삭제 벡터, 행 추적, 행 수준 동시성 및 자동 액체 클러스터링도 지원합니다. 이러한 기능을 사용하려면 Databricks Runtime 18.0 이상이 필요합니다. Apache Iceberg v3 기능 사용을 참조하세요.
액체 클러스터링을 사용하는 경우
Databricks는 스트리밍 테이블 및 구체화된 뷰를 포함하여 모든 새 테이블에 액체 클러스터링을 권장합니다. 다음 시나리오는 특히 클러스터링의 이점을 제공합니다.
- 높은 카디널리티 열을 필터링하는 쿼리입니다.
- 데이터 오차가 많은 테이블입니다.
- 유지 관리 및 튜닝 노력이 필요한 빠르게 성장하는 테이블입니다.
- 동시 쓰기 요구 사항이 있는 테이블입니다.
- 액세스 패턴이 다양하거나 변경된 테이블입니다.
- 일반적인 파티션 키가 너무 많거나 너무 적은 파티션의 결과를 반환할 수 있는 테이블입니다.
액체 클러스터링 사용
분할되지 않은 기존 테이블에서 또는 테이블을 만드는 동안 액체 클러스터링을 사용하도록 설정할 수 있습니다. 클러스터링이 분할 또는 ZORDER.와 호환되지 않습니다. Databricks는 플랫폼에서 테이블의 데이터에 대한 모든 레이아웃 및 최적화 작업을 관리할 수 있도록 하는 것이 좋습니다. Liquid 클러스터링을 사용하도록 설정한 후, 작업 OPTIMIZE을 실행하여 데이터를 점진적으로 클러스터링합니다. 클러스터링을 트리거하는 방법을 참조 하세요.
클러스터링을 사용하여 테이블 만들기
액체 클러스터링을 사용하도록 설정하려면 아래 예제와 같이 테이블 생성 문에 구를 추가 CLUSTER BY 합니다. Databricks Runtime 14.3 LTS 이상에서는 Python 또는 Scala에서 DataFrame API 및 DeltaTable API를 사용하여 Delta Lake 테이블에 액체 클러스터링을 사용하도록 설정할 수 있습니다.
SQL
클러스터링을 사용하여 빈 테이블을 만들려면 다음을 수행합니다.
CREATE TABLE table1 (col0 INT, col1 STRING) CLUSTER BY (col0);
클러스터링을 사용해 기존 데이터로부터 테이블을 만들려면 CLUSTER BY는 SELECT 절이 아니라 테이블 이름 뒤에 와야 합니다.
CREATE TABLE table2 CLUSTER BY (col0)
AS SELECT * FROM table1;
클러스터링 구성을 포함한 테이블 구조를 복사하려면 다음을 수행합니다.
CREATE TABLE table3 LIKE table1;
Python
클러스터링을 사용하는 빈 테이블을 만들려면 DeltaTable API를 사용하여 다음을 수행합니다:
(DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute())
기존 DataFrame에서 테이블을 만들려면 다음을 수행합니다.
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
API를 사용하여 DataFrameWriterV2 테이블을 만들려면(Databricks Runtime 14.2 이상에서 사용 가능):
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Scala
클러스터링을 사용하는 빈 테이블을 만들려면 DeltaTable API를 사용하여 다음을 수행합니다:
DeltaTable.create()
.tableName("table1")
.addColumn("col0", dataType = "INT")
.addColumn("col1", dataType = "STRING")
.clusterBy("col0")
.execute()
기존 DataFrame에서 테이블을 만들려면 다음을 수행합니다.
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")
API를 사용하여 DataFrameWriterV2 테이블을 만들려면(Databricks Runtime 14.2 이상에서 사용 가능):
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()
Important
DataFrame API를 사용하여 클러스터링 키를 설정하는 경우, 테이블을 생성할 때나 overwrite 모드(예: CREATE OR REPLACE TABLE 작업)를 사용할 때 클러스터링 열을 지정할 수 있습니다. 모드를 사용하는 append 경우 클러스터링 키를 변경할 수 없습니다.
데이터를 추가하는 동안 기존 테이블의 클러스터링 키를 변경하려면 SQL ALTER TABLE 명령을 사용하여 데이터 쓰기 작업과 별도로 클러스터링 구성을 수정합니다.
클러스터링 키 변경을 참조하세요.
Databricks Runtime 16.4 LTS 이상에서는 다음 예제와 같이 구조적 스트리밍 쓰기를 사용하여 액체 클러스터링을 사용하도록 설정된 테이블을 만들 수 있습니다.
SQL
CREATE TABLE table1 (
col0 STRING,
col1 DATE,
col2 BIGINT
)
CLUSTER BY (col0, col1);
Python
(spark.readStream.table("source_table")
.writeStream
.clusterBy("column_name")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
)
Scala
spark.readStream.table("source_table")
.writeStream
.clusterBy("column_name")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
Warning
액체 클러스터링을 사용하도록 설정된 Delta Lake 테이블은 Delta 기록기 버전 7 및 판독기 버전 3을 사용합니다. 이러한 프로토콜을 지원하지 않는 델타 클라이언트는 이러한 테이블을 읽을 수 없습니다. 테이블 프로토콜 버전을 다운그레이드할 수 없습니다. Delta Lake 기능 호환성 및 프로토콜을 참조하세요.
삭제 벡터와 같은 기본 기능 사용 설정을 재정의하려면 기본 기능 사용(선택 사항) 재정의를 참조하세요.
기존 테이블에서 사용
분할되지 않은 기존 Delta Lake 테이블에서 액체 클러스터링을 사용하도록 설정하려면 다음을 수행합니다.
ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)
관리되는 Apache Iceberg 테이블의 경우 다음을 고려합니다.
- v2 사양이 있는 테이블의 경우 기존 테이블에서 Liquid 클러스터링을 사용하도록 설정할 때 삭제 벡터 및 행 추적을 명시적으로 해제해야 합니다.
- v3 사양이 있는 테이블의 경우 삭제 벡터 및 행 추적이 지원되므로 이러한 기능을 해제할 필요가 없습니다. Apache Iceberg v3 기능 사용을 참조하세요.
참고
기본 동작은 이전에 작성된 데이터에 클러스터링을 적용하지 않습니다. 강제로 다시 클러스터링을 하려면 OPTIMIZE FULL 또는 OPTIMIZE FULL WHERE <predicate>을 사용하십시오.
강제 재클러스터링을 참조하세요.
분할된 테이블을 액체 클러스터링으로 변환
Databricks Runtime 18.1 이상에서는 기존 파티션된 Delta Lake 테이블을 리퀴드 클러스터링으로 변환하려면 ALTER TABLE 문에서 REPLACE PARTITIONED BY WITH CLUSTER BY을 사용합니다. 변환은 판독기 및 기록기 가동 중지 시간을 최소화하고 외부 테이블과 관리되는 테이블을 모두 지원합니다. 변환 후 테이블은 Databricks Runtime 13.3 LTS 이상의 읽기를 지원합니다.
참고
관리되는 Iceberg 테이블의 경우 이러한 테이블은 파티션 정의를 액체 클러스터링 키로 사용하기 때문에 변환이 필요하지 않습니다. 변환 명령을 실행하면 오류가 발생합니다.
분할된 테이블을 Liquid 클러스터링으로 변환하면 다음과 같은 이점이 있습니다.
- 비효율적인 데이터 스킵 또는 과도한 파티셔닝으로 인해 성능이 저하된 테이블에 대한 성능 개선
- 쿼리 패턴이 자주 변경되는 테이블에 대해 자동 성능 향상(사용
CLUSTER BY AUTO). - 클러스터링 열은 유연하고 수정도 간단한 반면, 파티셔닝은 경직되어 있고 수정하기 어렵습니다.
- 액체 클러스터링이 있는 테이블은 행 수준 동시성을 허용하므로 쓰기 충돌이 줄어듭니다. 행 수준 동시성을 참조하십시오.
Syntax
ALTER TABLE <table_name>
REPLACE PARTITIONED BY WITH CLUSTER BY [( <clustering_columns> ) | AUTO]
CLUSTER BY 절은 다음 옵션을 지원합니다.
-
( <clustering_columns> ): 새 클러스터링 열을 지정합니다. Databricks는 새 클러스터링 열을 원래 파티션 열과 비슷하게 유지하는 것이 좋습니다. 매우 다른 열을 사용하면 첫 번째OPTIMIZE실행에서 큰 재클러스터링 작업이 트리거됩니다. -
AUTO: 현재 파티션 열을 초기 클러스터링 열로 사용하고 시간에 따라 예측 최적화를 조정할 수 있습니다. Unity 카탈로그 관리 테이블에만 사용할 수 있습니다. 자동 액체 클러스터링을 참조하세요. - 지정한 옵션 없음: 현재 파티션 열을 새 클러스터링 열로 사용합니다.
분할된 테이블에서 마이그레이션할 때 클러스터링 키를 선택하는 방법에 대한 지침은 분할 또는 Z 순서에서 마이그레이션을 참조하세요.
예제
원래 파티션에 사용된 열과 다른 열을 기준으로 클러스터링하려면(예: (year, month, day) 열을 기준으로 파티션된 테이블의 경우) 다음을 수행합니다.
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (day, id);
OPTIMIZE t1;
참고
클러스터링 열을 변경하여 이점을 활용하려면 다음을 실행 OPTIMIZE해야 합니다.
자동 액체 클러스터링을 사용하고 현재 파티션 열로 시작하려면 다음을 수행합니다.
ALTER TABLE t2 REPLACE PARTITIONED BY WITH CLUSTER BY AUTO;
현재 파티션 열을 클러스터링 열로 유지하려면 다음을 수행합니다.
ALTER TABLE t3 REPLACE PARTITIONED BY WITH CLUSTER BY;
변환 중에 동시 읽기 및 쓰기 처리
변환 후 Databricks Runtime 13.3 LTS 이상은 읽기 및 쓰기에 대해 지원됩니다. Azure Databricks 변환 중에 테이블을 읽거나 쓰는 워크로드에 Databricks Runtime 15.4 LTS 이상을 권장합니다.
변환 중에 동시 읽기 및 쓰기 워크로드를 처리하는 방법은 다음 표를 참조하세요.
| 워크로드 유형 | 변환 중 읽기 | 변환 중에 쓰기 |
|---|---|---|
| Batch | 가동 중지 시간이 없습니다. 모든 Databricks 런타임 버전은 변환 중에 테이블을 읽을 수 있습니다. | Databricks Runtime 15.4 이상에는 가동 중지 시간이 없습니다. Databricks Runtime 15.3 이하의 경우 변환하기 전에 워크로드를 일시 중지한 다음 변환이 완료된 후 워크로드를 다시 시작하는 것이 좋습니다. |
| Streaming |
스키마 추적 및 열 매핑 사용: 커밋을 잃지 않고 스트림을 다시 시작합니다. 스키마 추적 및 열 매핑이 없으면 스트림에서 예외가 발생합니다. 새 검사점 위치로 다시 시작하고 버전을 시작합니다. 커밋은 손실되지 않습니다. |
커밋을 잃지 않고 스트림을 다시 시작합니다. |
변환 확인 또는 롤백
변환을 확인하려면 새 클러스터링 열을 보려면 실행 DESCRIBE EXTENDED 합니다. 일련의 REORG 작업, UPGRADE PROTOCOL 작업 및 REPLACE PARTITIONED BY WITH CLUSTER BY 작업을 확인하려면 DESCRIBE HISTORY을 실행합니다.
변환을 롤백하려면 이전 버전으로 돌아가려면 사용합니다 RESTORE . 또는 .를 사용하여 REPLACE TABLE ... PARTITIONED BY (...) AS SELECT * FROM ...테이블을 다시 작성할 수 있습니다.
RESTORE을 사용하여 롤백하려면 다음 명령을 실행하세요:
ALTER TABLE my_table CLUSTER BY NONE;
ALTER TABLE my_table UNSET TBLPROPERTIES ('delta.liquid.hierarchicalClusteringColumns');
RESTORE TABLE my_table TO VERSION AS OF <version_number_before_conversion>;
RESTORE을(를) 참조하세요.
타임스탬프 열로 분할된 테이블 변환
타임스탬프 열()로 분할된 테이블(t1timestamp_col)을 변환하고 타임스탬프 열을 클러스터링 키로 사용하려면 추가 구성을 설정해야 합니다.
SET spark.databricks.delta.liquidConversion.statsGeneration.enabled = false;
ALTER TABLE t1 REPLACE PARTITIONED BY WITH CLUSTER BY (timestamp_col, id);
ANALYZE TABLE t1 COMPUTE DELTA STATISTICS;
이러한 구성 없이 타임스탬프 파티션 열을 클러스터링 열로 변환하려고 하면 다음 명령에서 오류가 발생합니다.
ALTER TABLE REPLACE PARTITIONED BY WITH CLUSTER BY cannot auto-generate stats on table with column event_ts due to unsupported type: timestamp. Disable stats auto-generation by setting 'spark.databricks.delta.liquidConversion.statsGeneration.enabled' to 'false' and retry the command again. SQLSTATE: 42000
변환 제한 사항
변환 명령에는 다음과 같은 제한 사항이 적용됩니다 REPLACE PARTITIONED BY WITH CLUSTER BY .
- Lakeflow Spark 선언적 파이프라인에서 만든 스트리밍 테이블 및 구체화된 뷰는 지원되지 않습니다. 리퀴드 클러스터링을 사용하려면 파이프라인 정의를 업데이트하여
PARTITIONED BY대신CLUSTER BY를 사용하도록 해야 합니다. - 파티션 필터링과 함께 델타 공유를 사용하는 테이블은 지원되지 않습니다. 델타 공유에 대한 파티션 필터링에 대한 자세한 내용은 공유할 테이블 파티션 지정을 참조하세요.
클러스터링 키 제거
클러스터링 키를 제거하려면 다음 구문을 사용합니다.
ALTER TABLE table_name CLUSTER BY NONE;
클러스터링 키 선택
쿼리 필터에서 가장 일반적으로 사용되는 열에 따라 클러스터링 키를 선택합니다. 올바른 키는 데이터 건너뛰기 및 쿼리 성능을 크게 향상시킵니다.
Tip
Databricks는 자동 액체 클러스터링을 사용하여 쿼리 패턴에 따라 클러스터링 키를 지능적으로 선택하는 것이 좋습니다. 자동 액체 클러스터링을 참조하세요.
주요 선택 지침
클러스터링 키를 수동으로 지정하는 경우 쿼리 필터에서 가장 자주 사용되는 열을 기반으로 열을 선택합니다. 클러스터링 키는 순서에 따라 정의할 수 있습니다. 두 열의 상관 관계가 높은 경우 해당 열 중 하나만 클러스터링 키로 포함하면 됩니다.
최대 4개의 클러스터링 키를 지정할 수 있습니다. 작은 테이블(10TB 미만)의 경우 더 많은 클러스터링 키를 사용하면 단일 열에서 필터링할 때 성능이 저하됩니다. 예를 들어 4개의 키를 사용하여 필터링하면 두 개의 키를 사용하여 필터링하는 것보다 성능이 더 나쁩니다. 그러나 테이블 크기가 증가함에 따라 단일 열 쿼리의 경우 이 성능 차이가 무시할 수 있습니다.
클러스터링 키는 통계 수집이 완료된 열이어야 합니다. 기본적으로 Delta Lake 테이블은 처음 32개 열에 대한 통계를 수집합니다. 통계 열 지정을 참조하세요.
지원되는 데이터 형식
클러스터링에서는 클러스터링 키에 대해 다음과 같은 데이터 형식을 지원합니다.
- 날짜
- 타임스탬프
- TimestampNTZ(Databricks Runtime 14.3 LTS 이상)
- 스트링
- 정수, 장정수, 단정수, 바이트
- Float (부동소수점), Double (배정밀도 부동소수점), Decimal (십진수)
CLUSTER BY (struct_col.field)와 같은 점 표기법을 사용하여 StructField를 기준으로 클러스터링할 수 있습니다. 중첩된 구조체 필드는 다음과 같은 CLUSTER BY (struct_col.nested.field)모든 깊이에서 지원됩니다. 필드의 데이터 형식은 이전 목록에서 지원되는 형식 중 하나여야 합니다.
다음 중 어느 것으로도 클러스터할 수 없습니다.
- 복합 형식(예:
StructType, 또는)MapTypeArrayType -
MapType및ArrayType요소(예:map_col['key'],array_col[0]또는map_col.key.
파티셔닝 또는 Z-순서에서의 마이그레이션
Important
Databricks는 REPLACE PARTITIONED BY WITH CLUSTER BY 명령을 통한 자동 변환을 사용할 것을 권장합니다.
분할된 테이블을 액체 클러스터링으로 변환을 참조하세요.
기존 테이블을 변환하는 경우 다음 권장 사항을 고려하세요.
| 현재 데이터 최적화 기술 | 클러스터링 키에 대한 권장 사항 |
|---|---|
| Hive 스타일 파티셔닝 | 파티션 열을 클러스터링 키로 사용합니다. |
| Z 순서 인덱싱 |
ZORDER BY 열을 클러스터링 키로 사용합니다. |
| Hive 방식의 파티셔닝 및 Z-순서 설정 | 파티션 열과 ZORDER BY 열을 모두 클러스터링 키로 사용합니다. |
| 카디널리티를 줄이기 위해 생성된 열(예: 타임스탬프의 날짜) | 원래 열을 클러스터링 키로 사용하고 생성된 열을 만들지 않습니다. |
자동 액체 군집화
Databricks Runtime 15.4 LTS 이상에서는 Unity 카탈로그 관리형 Delta Lake 테이블에 대해 자동 액체 클러스터링을 사용하도록 설정할 수 있습니다. Unity 카탈로그 관리형 Apache Iceberg v3 테이블의 경우 자동 액체 클러스터링에는 Databricks Runtime 18.0 이상이 필요합니다. 자동 액체 클러스터링을 사용하면 Azure Databricks CLUSTER BY AUTO 절을 사용하여 클러스터링 키를 지능적으로 선택하여 쿼리 성능을 최적화할 수 있습니다.
참고
자동 액체 클러스터링도 Lakeflow Spark 선언적 파이프라인 및 독립 실행형 파이프라인을 비롯한 구체화된 뷰 및 스트리밍 테이블에도 지원됩니다. 파이프라인 또는 SQL 정의에 CLUSTER BY AUTO를 지정하세요.
자동 액체 클러스터링 작동 방식
자동 액체 클러스터링에는 자동 키 선택 및 클러스터링 작업에 대한 예측 최적화가 필요하며 비동기적으로 실행됩니다. Unity 카탈로그 관리 테이블에 대한 예측 최적화를 참조하세요.
자동 액체 클러스터는 사용 패턴에 따라 지능형 최적화를 적용합니다.
- 쿼리 워크로드 분석: Azure Databricks는 테이블의 기록 쿼리 워크로드를 분석하고 클러스터링에 가장 적합한 후보 열을 식별합니다.
- 변경 내용에 맞게 조정: 시간이 지남에 따라 쿼리 패턴 또는 데이터 분포가 변경되면 자동 액체 클러스터링이 성능을 최적화하기 위해 새 키를 선택합니다.
- 비용 효율적인 선택: Azure Databricks는 데이터 건너뛰기 개선으로 인한 예상 비용 절감이 데이터 클러스터링 비용보다 클 경우에만 클러스터링 키를 변경합니다.
자동 액체 클러스터링에서는 다음과 같은 이유로 키를 선택하지 않을 수 있습니다.
- 테이블이 너무 작아 액체 클러스터링의 이점을 누릴 수 없습니다.
- 테이블에는 이미 이전 수동 키 또는 쿼리 패턴과 일치하는 자연 삽입 순서의 효과적인 클러스터링 구성표가 있습니다.
- 해당 테이블에 대한 빈번한 쿼리가 없습니다.
- Databricks Runtime 버전 15.4 LTS 이상을 사용하고 있지 않습니다.
데이터 및 쿼리 특성에 관계없이 모든 Unity 카탈로그 관리 테이블에 자동 액체 클러스터링을 적용할 수 있습니다. 추론은 클러스터링 키를 선택하는 것이 비용 유익한지 여부를 결정합니다.
Databricks 런타임 버전 호환성
액체 클러스터링을 지원하는 모든 Databricks 런타임 버전에서 자동 클러스터링을 사용하도록 설정된 테이블을 읽거나 쓸 수 있습니다. 그러나 지능형 키 선택은 Databricks Runtime 15.4 LTS에 도입된 메타데이터를 사용합니다.
Databricks Runtime 15.4 LTS 이상을 사용하여 자동으로 선택된 키가 모든 워크로드에 도움이 되도록 하고 새 키를 선택할 때 이러한 워크로드를 고려합니다.
자동 액체 클러스터링 사용 또는 해제
SQL
자동 액체 클러스터링을 사용하여 테이블을 만들려면 다음을 수행합니다.
CREATE OR REPLACE TABLE table1 (column01 int, column02 string) CLUSTER BY AUTO;
수동으로 지정된 키가 있는 테이블을 포함하여 기존 테이블에서 자동 액체 클러스터링을 사용하도록 설정하려면 다음을 수행합니다.
ALTER TABLE table1 CLUSTER BY AUTO;
키 선택에 대한 초기 클러스터링 열 힌트를 설정하려면 클러스터링 키를 설정한 다음 자동 클러스터링을 설정합니다.
ALTER TABLE table1 CLUSTER BY (c1, c2);
ALTER TABLE table1 CLUSTER BY AUTO;
또는 Python API를 사용하여 단일 작업에서 힌트를 설정합니다.
자동 액체 클러스터링을 해제하려면 다음을 수행합니다.
ALTER TABLE table1 CLUSTER BY NONE;
자동 액체 클러스터링을 해제하고 클러스터링 열을 지정하려면 다음을 수행합니다.
ALTER TABLE table1 CLUSTER BY (column01, column02);
기존 테이블에 자동 액체 클러스터링이 사용하도록 설정된 경우 자동 클러스터링을 해제하지 않고 CREATE OR REPLACE table_name 실행 CLUSTER BY AUTO 하면 클러스터링 열이 유지되지 않습니다. 자동 액체 클러스터링과 이전에 선택한 열을 유지하려면 replace 문에 CLUSTER BY AUTO를 포함하세요.
CLUSTER BY AUTO예측 최적화에서는 테이블에 대한 기록 쿼리 워크로드를 사용하여 최상의 클러스터링 키를 식별합니다.
Python
Python API는 Databricks Runtime 16.4 이상에서 사용할 수 있습니다. 테이블을 만들거나 바꿀 때만 Python을 사용할 수 있습니다. SQL을 사용하여 기존 테이블의 상태를 변경 clusterByAuto 합니다.
DataFrameWriter를 사용하여 자동 액체 클러스터링이 적용된 테이블을 만들려면:
df = spark.read.table("table1")
df.write
.format("delta")
.option("clusterByAuto", "true")
.saveAsTable(...)
DataFrameWriter를 사용하여 키 선택용 초기 클러스터링 열 힌트를 설정하려면:
df.write
.format("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.saveAsTable(...)
DataFrameWriterV2를 사용하여 자동 액체 클러스터링이 적용된 테이블을 만들려면:
df.writeTo(...).using("delta")
.option("clusterByAuto", "true")
.create()
DataFrameWriterV2를 사용하여 키 선택용 초기 클러스터링 열 힌트를 설정하려면:
df.writeTo(...).using("delta")
.clusterBy("clusteringColumn1", "clusteringColumn2")
.option("clusterByAuto", "true")
.create()
자동 액체 클러스터링을 사용하여 스트리밍 테이블을 만들려면 다음을 수행합니다.
spark.readStream.table("source_table")
.writeStream
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
스트리밍 테이블에서 키 선택에 대한 초기 클러스터링 열 힌트를 설정하려면 다음을 수행합니다.
spark.readStream.table("source_table")
.writeStream
.clusterBy("column1", "column2")
.option("clusterByAuto", "true")
.option("checkpointLocation", checkpointPath)
.toTable("target_table")
클러스터 키 선택 힌트를 .clusterBy함께 사용하는 .option('clusterByAuto', 'true') 경우 동작은 다음과 같습니다.
- 이렇게 하면 자동 액체 클러스터링이 처음으로 설정되면 클러스터링 열이 지정된 열로
.clusterBy설정됩니다. - 자동 액체 클러스터링을 사용하도록 설정된
.clusterBy기존 테이블인 경우 힌트는 한 번만 허용됩니다. 예를 들어 테이블에 클러스터링 열이 설정되어 있지 않은 경우에만 지정된.clusterBy열이 설정됩니다.
Important
DataFrame API를 사용할 때는 clusterByAuto 모드를 overwrite 방식으로 사용할 때만 옵션을 설정할 수 있습니다.
clusterByAuto 모드를 사용할 때 append을(를) 설정할 수 없습니다. 이 제한은 클러스터링 열을 수동으로 설정할 때와 동일합니다. 모드를 사용하여 overwrite 테이블을 만들거나 교체 작업하는 동안에만 클러스터링 설정을 구성할 수 있습니다.
해결 방법으로 데이터를 추가하는 동안 기존 테이블의 clusterByAuto 상태를 변경하려면 SQL ALTER TABLE 명령을 사용하여 데이터 쓰기 작업과 별도로 클러스터링 구성을 수정합니다.
자동 클러스터링이 사용되는지 확인
테이블에 자동 액체 클러스터링이 사용되도록 설정되어 있는지 확인하려면 DESCRIBE TABLE 또는 SHOW TBLPROPERTIES 중 하나를 사용합니다.
자동 액체 클러스터링을 사용하도록 설정하면 속성이 clusterByAuto .로 true설정됩니다. 속성은 clusteringColumns 자동으로 또는 수동으로 선택된 현재 클러스터링 열을 표시합니다.
제한점
관리형 Apache Iceberg v2 테이블에는 자동 액체 클러스터링을 사용할 수 없습니다. Databricks Runtime 18.0 이상에서 관리되는 Apache Iceberg v3 테이블에 대해 지원됩니다.
클러스터형 테이블에 데이터 쓰기
클러스터링된 Delta Lake 테이블에 쓰려면 리퀴드 클러스터링에서 사용하는 모든 Delta 쓰기 프로토콜의 테이블 기능을 지원하는 Delta 쓰기 클라이언트를 사용해야 합니다. 클러스터형 Iceberg 테이블에 쓰려면 Unity 카탈로그의 Iceberg REST 카탈로그 API를 사용할 수 있습니다. Azure Databricks에서는 Databricks Runtime 13.3 LTS 이상을 사용해야 합니다.
쓰기에 클러스터링을 지원하는 작업
쓰기에 클러스터되는 작업에는 다음이 포함됩니다.
-
INSERT INTO작업 -
CTAS및RTAS문장 -
COPY INTOParquet 형식에서 spark.write.mode("append")
클러스터링에 대한 크기 임계값
쓰기 시 클러스터링은 트랜잭션의 데이터가 크기 임계값을 충족하는 경우에만 트리거됩니다. 이러한 임계값은 클러스터링 열 수에 따라 다르며 Unity 카탈로그 관리 테이블의 경우 다른 Delta Lake 테이블보다 낮습니다.
| 클러스터링 열 수 | Unity 카탈로그 관리 테이블의 임계값 크기 | 다른 Delta Lake 테이블의 임계값 크기 |
|---|---|---|
| 1 | 64MB | 256MB |
| 2 | 256MB | 1GB |
| 3 | 512MB | 2GB |
| 4 | 1GB | 4GB |
모든 작업이 액체 클러스터링을 적용하는 것은 아니므로 Databricks는 모든 데이터가 효율적으로 클러스터링되도록 자주 실행하는 OPTIMIZE 것이 좋습니다.
스트리밍 워크로드
구조적 스트리밍 워크로드는 Spark 구성 spark.databricks.delta.liquid.eagerClustering.streaming.enabled를 true로 설정할 때 쓰기 클러스터링을 지원합니다. 이러한 워크로드에 대한 클러스터링은 마지막 5개 스트리밍 업데이트 중 하나 이상이 위의 테이블에서 크기 임계값을 초과하는 경우에만 트리거됩니다.
클러스터링을 트리거하는 방법
예측 최적화는 사용하도록 설정된 테이블에 대한 OPTIMIZE 명령을 자동으로 실행합니다. Unity 카탈로그 관리 테이블에 대한 예측 최적화를 참조하세요. 예측 최적화를 사용하는 경우 Databricks는 예약된 OPTIMIZE 작업을 사용하지 않도록 설정하는 것이 좋습니다.
클러스터링을 트리거하려면 Databricks Runtime 13.3 LTS 이상을 사용해야 합니다. Databricks는 큰 테이블에서 더 빠른 OPTIMIZE 성능을 위해 Databricks Runtime 17.3 LTS 이상을 권장합니다. 테이블에 OPTIMIZE 명령을 사용하십시오.
OPTIMIZE table_name;
Liquid 클러스터링은 점진적입니다. 이는 클러스터링이 OPTIMIZE 필요한 데이터를 수용할 때, 필요한 경우에만 데이터를 다시 기록한다는 것을 의미합니다.
OPTIMIZE 는 클러스터링되는 데이터와 일치하지 않는 클러스터링 키를 사용하여 데이터 파일을 다시 작성하지 않습니다.
강제 재클러스터링을 참조하세요.
예측 최적화를 사용하지 않는 경우 Databricks는 일반 OPTIMIZE 작업을 클러스터 데이터에 예약하는 것이 좋습니다. 많은 업데이트 또는 삽입이 발생하는 테이블의 경우 Databricks는 1~2시간마다 OPTIMIZE 작업을 예약하는 것이 좋습니다. 액체 클러스터링이 증분이므로 클러스터형 테이블에 대한 대부분의 OPTIMIZE 작업이 빠르게 실행됩니다.
강제 재클러스터링
Databricks Runtime 16.4 LTS 이상에서는 다음 구문을 사용하여 테이블의 모든 레코드를 강제로 다시 클러스터링할 수 있습니다.
OPTIMIZE table_name FULL;
Important
OPTIMIZE FULL 실행하면 필요에 따라 모든 기존 데이터가 클러스터링됩니다. 이전에 지정된 키에 클러스터되지 않은 큰 테이블의 경우 이 작업에 몇 시간이 걸릴 수 있습니다.
처음으로 클러스터링을 사용하도록 설정하거나 클러스터링 키를 변경할 때 OPTIMIZE FULL 실행합니다. 이전에 OPTIMIZE FULL 실행했으며 클러스터링 키가 변경되지 않은 경우 OPTIMIZE FULLOPTIMIZE동일하게 실행됩니다. 이 시나리오 OPTIMIZE 에서는 증분 방법을 사용하고 이전에 압축되지 않은 파일만 다시 작성합니다. 항상 OPTIMIZE FULL 사용하여 데이터 레이아웃이 현재 클러스터링 키를 반영하도록 합니다.
부분 재클러스터링
Databricks Runtime 18.1 이상에서는 다음을 사용하여 OPTIMIZE FULL WHERE <predicate>레코드의 하위 집합에 대해 강제로 다시 클러스터링을 수행할 수 있습니다. 범위의 일부가 조건자와 겹치는 경우 파일이 포함됩니다.
매개 변수를 참조하세요.
OPTIMIZE events FULL WHERE event_date >= '2025-01-01';
클러스터형 테이블에서 데이터를 읽습니다.
삭제 벡터 읽기를 지원하는 Delta Lake 클라이언트를 사용하여 클러스터형 Delta Lake 테이블에서 데이터를 읽을 수 있습니다. Iceberg REST 카탈로그 API를 사용하여 클러스터형 Iceberg 테이블에서 데이터를 읽을 수 있습니다. Liquid 클러스터링을 사용하면 클러스터링 키를 기반으로 필터링할 때 데이터를 자동으로 건너뛰어 쿼리 성능이 향상됩니다.
SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";
클러스터링 키 관리
테이블이 클러스터되는 방법 보기
다음 예제와 같이 DESCRIBE 명령을 사용하여 테이블에 대한 클러스터링 키를 볼 수 있습니다.
DESCRIBE TABLE table_name;
DESCRIBE DETAIL table_name;
클러스터링 키 변경
다음 예제와 같이 ALTER TABLE 명령을 실행하여 언제든지 테이블의 클러스터링 키를 변경할 수 있습니다.
ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);
클러스터링 키를 변경하는 경우 후속 OPTIMIZE 및 쓰기 작업은 새 클러스터링 방법을 사용하지만 기존 데이터는 다시 작성되지 않습니다. 업데이트된 클러스터링 키를 사용하여 기존 데이터를 다시 쓰려면 강제 클러스터링을 참조하세요.
다음 예제와 같이 키를 설정하여 클러스터링을 해제할 NONE수도 있습니다.
ALTER TABLE table_name CLUSTER BY NONE;
클러스터 키를 NONE로 설정하면 클러스터된 데이터가 다시 작성되지 않지만, 향후 OPTIMIZE 작업에서는 클러스터링 키를 사용할 수 없습니다.
외부 엔진에서 액상 클러스터링을 사용하기
외부 Iceberg 엔진에서 관리되는 Iceberg 테이블에서 액체 클러스터링을 사용하도록 설정할 수 있습니다. 액체 클러스터링을 사용하도록 설정하려면 테이블을 만들 때 파티션 열을 지정합니다. Unity 카탈로그는 파티션을 클러스터링 키로 해석합니다. 예를 들어 OSS Spark에서 아래 명령을 실행합니다.
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY c1;
액체 클러스터링을 해제하려면 다음을 수행합니다.
ALTER TABLE main.schema.icebergTable DROP PARTITION FIELD c2;
Iceberg 파티션 진화를 사용하여 클러스터링 키를 변경하려면 다음을 수행합니다.
ALTER TABLE main.schema.icebergTable ADD PARTITION FIELD c2;
버킷 변환을 사용하여 파티션을 지정하는 경우 Unity 카탈로그는 식을 삭제하고 열을 클러스터링 키로 사용합니다.
CREATE OR REPLACE TABLE main.schema.icebergTable
PARTITIONED BY (bucket(c1, 10));
액체 클러스터링이 있는 테이블에 대한 호환성
Liquid 클러스터링에서는 읽기 및 쓰기를 위해 특정 Databricks 런타임 버전이 필요한 Delta Lake 테이블 기능을 사용합니다. Databricks Runtime 14.3 LTS 이상에서 Liquid 클러스터링을 사용하여 만든 테이블은 기본적으로 검사점 V2를 사용합니다. Databricks Runtime 13.3 LTS 이상에서 검사점 V2를 사용하여 테이블을 읽고 쓸 수 있습니다. 검사점 V2를 참조하세요.
Databricks Runtime 12.2 LTS를 13.2로 사용하여 판독기를 지원하려면 검사점 V2를 사용하지 않도록 설정하고 테이블 프로토콜을 다운그레이드합니다. 클래식으로 다운그레이드를 참조하세요.
기본 기능 사용 재정의(선택 사항)
리퀴드 클러스터링을 활성화하는 동안 기본 Delta Lake 테이블 기능 활성화를 재정의할 수 있습니다. 이렇게 하면 해당 테이블 기능과 연결된 판독기 및 기록기 프로토콜의 업그레이드가 방지됩니다. 다음 단계를 완료하려면 기존 테이블이 있어야 합니다.
하나 이상의 기능을 해제하는 테이블 속성을 설정하는 데 사용합니다
ALTER TABLE. 예를 들어 삭제 벡터를 해제하려면 다음을 실행합니다.ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);다음을 실행하여 테이블에서 Liquid 클러스터링을 활성화하세요.
ALTER TABLE <table_name> CLUSTER BY (<clustering_columns>)
다음 표에는 재정의할 수 있는 델타 기능과 활성화가 Databricks 런타임 버전과의 호환성에 미치는 영향에 대한 정보가 나와 있습니다.
| 델타 기능 | 런타임 호환성 | 사용 가능 상태를 재정의할 속성 | 해제된 경우 액체 클러스터링에 미치는 영향 |
|---|---|---|---|
| 삭제 벡터 | 읽기 및 쓰기에는 Databricks Runtime 12.2 LTS 이상이 필요합니다. | 'delta.enableDeletionVectors' = false |
삭제 벡터를 해제하면 행 수준 동시성도 해제되어 트랜잭션 및 클러스터링 작업이 충돌할 가능성이 높아집니다.
행 수준 동시성을 참조하십시오.DELETE, MERGE명령 UPDATE 이 느리게 실행될 수 있습니다. |
| 행 추적 | 쓰기에는 Databricks Runtime 13.3 LTS 이상이 필요합니다. Databricks 런타임 버전에서 읽을 수 있습니다. | 'delta.enableRowTracking' = false |
행 추적을 해제하면 행 수준 동시성도 해제되므로 트랜잭션 및 클러스터링 작업이 충돌할 가능성이 높아집니다. 행 수준 동시성을 참조하십시오. |
| 검사점 V2 | 읽기 및 쓰기에는 Databricks Runtime 13.3 LTS 이상이 필요합니다. | 'delta.checkpointPolicy' = 'classic' |
액체 클러스터링 동작에는 영향을 주지 않습니다. 검사점 V2를 참조하세요. |
제한점
- Databricks Runtime 15.1 이하: 쓰기 시 클러스터링에서는 필터, 조인 또는 집계를 포함하는 원본 쿼리를 지원하지 않습니다.
- Databricks Runtime 15.4 LTS 이하: 구조적 스트리밍 쓰기를 사용하여 액체 클러스터링을 사용하도록 설정된 테이블을 만들 수 없습니다. 구조적 스트리밍을 사용하여 액체 클러스터링을 사용하도록 설정된 기존 테이블에 데이터를 쓸 수 있습니다.
-
Apache Iceberg v2: 삭제 벡터 및 행 추적이 지원되지 않으므로 관리되는 Apache Iceberg v2 테이블에서 행 수준 동시성은 지원되지 않습니다.
- v3 사양은 삭제 벡터 및 행 추적을 지원하므로 관리되는 Apache Iceberg v3 테이블에서 행 수준 동시성이 지원됩니다. Apache Iceberg v3 기능 사용을 참조하세요.