다음을 통해 공유


델타 테이블에 액체 클러스터링 사용

Delta Lake Liquid 클러스터링이 테이블 분할을 대체하고 ZORDER 데이터 레이아웃 결정을 간소화하고 쿼리 성능을 최적화합니다. Liquid 클러스터링은 기존 데이터를 다시 작성하지 않고도 클러스터링 키를 다시 정의할 수 있는 유연성을 제공하므로 시간이 지남에 따라 분석 요구 사항과 함께 데이터 레이아웃을 발전시킬 수 있습니다.

Important

Databricks는 액체 클러스터링을 사용하는 모든 테이블에 Databricks Runtime 15.2 이상을 사용하는 것이 좋습니다. 제한 사항이 있는 공개 미리 보기 지원은 Databricks Runtime 13.3 LTS 이상에서 사용할 수 있습니다.

참고 항목

Liquid 클러스터링을 사용하도록 설정된 테이블은 Databricks Runtime 13.3 LTS 이상에서 행 수준 동시성을 지원합니다. 행 수준 동시성은 일반적으로 삭제 벡터가 활성화된 모든 테이블에 대해 Databricks Runtime 14.2 이상에서 사용할 수 있습니다. Azure Databricks의 격리 수준 및 쓰기 충돌을 참조하세요.

액체 클러스터링이 사용되는 용도는 무엇인가요?

Databricks는 모든 새 델타 테이블에 액체 클러스터링을 권장합니다. 다음은 클러스터링의 이점을 활용하는 시나리오의 예입니다.

  • 테이블은 높은 카디널리티 열로 필터링되는 경우가 많습니다.
  • 데이터 분포에 상당한 오차가 있는 테이블.
  • 빠르게 늘어나고 유지 관리 및 튜닝 노력이 필요한 테이블.
  • 동시 쓰기 요구 사항이 있는 테이블.
  • 시간이 지남에 따라 액세스 패턴이 변경되는 테이블.
  • 일반적인 파티션 키가 너무 많거나 너무 적은 파티션을 테이블에 만들 수 있는 테이블.

액체 클러스터링 사용

기존 테이블 또는 테이블을 만드는 동안 액체 클러스터링을 사용하도록 설정할 수 있습니다. 클러스터링이 분할 또는 ZORDER호환되지 않으므로 Azure Databricks를 사용하여 테이블의 데이터에 대한 모든 레이아웃 및 최적화 작업을 관리해야 합니다. Liquid 클러스터링을 사용하도록 설정한 후 평소와 같이 작업을 실행 OPTIMIZE 하여 데이터를 증분 방식으로 클러스터합니다. 클러스터링을 트리거하는 방법을 참조 하세요.

액체 클러스터링을 사용하도록 설정하려면 아래 예제와 같이 테이블 생성 문에 구를 추가 CLUSTER BY 합니다.

참고 항목

Databricks Runtime 14.2 이상에서는 Python 또는 Scala에서 DataFrame API 및 DeltaTable API를 사용하여 액체 클러스터링을 사용하도록 설정할 수 있습니다.

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) CLUSTER BY (col0);

-- Using a CTAS statement
CREATE EXTERNAL TABLE table2 CLUSTER BY (col0)  -- specify clustering after table name, not in subquery
LOCATION 'table_location'
AS SELECT * FROM table1;

-- Using a LIKE statement to copy configurations
CREATE TABLE table3 LIKE table1;

Python

# Create an empty table
(DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute())

# Using a CTAS statement
df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

# CTAS using DataFrameWriterV2
df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Scala

// Create an empty table
DeltaTable.create()
  .tableName("table1")
  .addColumn("col0", dataType = "INT")
  .addColumn("col1", dataType = "STRING")
  .clusterBy("col0")
  .execute()

// Using a CTAS statement
val df = spark.read.table("table1")
df.write.clusterBy("col0").saveAsTable("table2")

// CTAS using DataFrameWriterV2
val df = spark.read.table("table1")
df.writeTo("table1").using("delta").clusterBy("col0").create()

Warning

액체 클러스터링을 사용하도록 설정된 테이블은 만들 때 다양한 델타 테이블 기능을 사용하도록 설정하고 Delta 기록기 버전 7 및 판독기 버전 3을 사용합니다. 이러한 기능 중 일부의 사용을 재정의할 수 있습니다. 기본 기능 사용(선택 사항) 재정의를 참조하세요.

테이블 프로토콜 버전을 다운그레이드할 수 없으며 클러스터링이 설정된 테이블은 모든 사용 델타 판독기 프로토콜 테이블 기능을 지원하지 않는 Delta Lake 클라이언트에서 읽을 수 없습니다. Azure Databricks에서 Delta Lake 기능 호환성을 관리하는 방법을 참조하세요.

다음 구문을 사용하여 분할되지 않은 기존 Delta 테이블에서 Liquid 클러스터링을 사용하도록 설정할 수 있습니다.

ALTER TABLE <table_name>
CLUSTER BY (<clustering_columns>)

기본 기능 사용 재정의(선택 사항)

액체 클러스터링 사용 중에 델타 테이블 기능을 사용하도록 설정하는 기본 동작을 재정의할 수 있습니다. 이렇게 하면 해당 테이블 기능과 연결된 판독기 및 기록기 프로토콜이 업그레이드되지 않습니다. 다음 단계를 완료하려면 기존 테이블이 있어야 합니다.

  1. 하나 이상의 기능을 사용하지 않도록 설정하는 테이블 속성을 설정하는 데 사용합니다 ALTER TABLE . 예를 들어 삭제 벡터를 사용하지 않도록 설정하려면 다음을 실행합니다.

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. 다음을 실행하여 테이블에서 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' 액체 클러스터링 동작에 영향을 주지 않습니다.

클러스터링 키 선택

Databricks는 일반적으로 사용되는 쿼리 필터에 따라 클러스터링 키를 선택하는 것이 좋습니다. 클러스터링 키는 순서에 따라 정의할 수 있습니다. 두 열의 상관 관계가 있는 경우 해당 열 중 하나만 클러스터링 키로 추가하면 됩니다.

최대 4개의 열을 클러스터링 키로 지정할 수 있습니다. 클러스터링 키에 대해 수집된 통계가 있는 열만 지정할 수 있습니다. 기본적으로 Delta 테이블의 처음 32개 열에는 수집된 통계가 있습니다. 델타 통계 열 지정을 참조 하세요.

클러스터링에서는 클러스터링 키에 대해 다음 데이터 형식을 지원합니다.

  • 날짜
  • Timestamp
  • TimestampNTZ(Databricks Runtime 14.3 LTS 이상 필요)
  • 문자열
  • 정수
  • Long
  • Short
  • Float
  • 두 배
  • 소수
  • Byte

기존 테이블을 변환하는 경우 다음 권장 사항을 고려하세요.

현재 데이터 최적화 기술 클러스터링 키에 대한 권장 사항
Hive 스타일 분할 파티션 열을 클러스터링 키로 사용합니다.
Z 순서 인덱싱 ZORDER BY 열을 클러스터링 키로 사용합니다.
Hive 스타일 분할 및 Z 순서 파티션 열과 ZORDER BY 열을 모두 클러스터링 키로 사용합니다.
카디널리티를 줄이기 위해 생성된 열(예: 타임스탬프의 날짜) 원래 열을 클러스터링 키로 사용하고 생성된 열을 만들지 않습니다.

클러스터형 테이블에 데이터 쓰기

Liquid 클러스터링에서 사용하는 모든 델타 쓰기 프로토콜 테이블 기능을 지원하는 Delta 기록기 클라이언트를 사용해야 합니다. Azure Databricks에서는 Databricks Runtime 13.3 LTS 이상을 사용해야 합니다.

쓰기에 클러스터되는 작업에는 다음이 포함됩니다.

  • INSERT INTO 작업
  • CTASRTAS
  • COPY INTO Parquet 형식에서
  • spark.write.mode("append")

구조적 스트리밍 쓰기는 쓰기에 클러스터링을 트리거하지 않습니다. 추가 제한 사항이 적용됩니다. 제한 사항 보기.

쓰기 시 클러스터링은 트랜잭션의 데이터가 크기 임계값을 충족하는 경우에만 트리거됩니다. 이러한 임계값은 클러스터링 열 수에 따라 다르며 Unity 카탈로그 관리 테이블의 경우 다른 델타 테이블보다 낮습니다.

클러스터링 열 수 Unity 카탈로그 관리 테이블의 임계값 크기 다른 델타 테이블의 임계값 크기
1 64MB 256MB
2 256MB 1GB
3 512MB 2GB
4 1GB 4GB

모든 작업이 액체 클러스터링을 적용하는 것은 아니므로 Databricks는 모든 데이터가 효율적으로 클러스터링되도록 자주 실행하는 OPTIMIZE 것이 좋습니다.

클러스터링을 트리거하는 방법

예측 최적화는 사용하도록 설정된 테이블에 대한 명령을 자동으로 실행 OPTIMIZE 합니다. Unity 카탈로그 관리 테이블에 대한 예측 최적화를 참조하세요.

클러스터링을 트리거하려면 Databricks Runtime 13.3 LTS 이상을 사용해야 합니다. 다음 예제와 같이 테이블의 OPTIMIZE 명령을 사용합니다.

OPTIMIZE table_name;

Liquid 클러스터링이 증분이므로 클러스터링해야 하는 데이터를 수용하기 위해 필요에 따라 데이터만 다시 작성됩니다. 클러스터링할 데이터와 일치하지 않는 클러스터링 키가 있는 데이터 파일은 다시 작성되지 않습니다.

최상의 성능을 위해 Databricks는 일반 OPTIMIZE 작업을 클러스터 데이터에 예약하는 것이 좋습니다. 많은 업데이트 또는 삽입이 발생하는 테이블의 경우 Databricks는 1~2시간마다 작업을 예약하는 OPTIMIZE 것이 좋습니다. 액체 클러스터링이 증분이므로 클러스터형 테이블에 대한 대부분의 OPTIMIZE 작업은 빠르게 실행됩니다.

클러스터형 테이블에서 데이터를 읽습니다.

삭제 벡터 읽기를 지원하는 Delta Lake 클라이언트를 사용하여 클러스터형 테이블의 데이터를 읽을 수 있습니다. 최상의 쿼리 결과를 위해 다음 예제와 같이 쿼리 필터에 클러스터링 키를 포함합니다.

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

클러스터링 키 변경

다음 예제와 같이 명령을 실행하여 언제든지 테이블의 ALTER TABLE 클러스터링 키를 변경할 수 있습니다.

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

클러스터링 키를 변경하는 경우 후속 OPTIMIZE 및 쓰기 작업은 새 클러스터링 방법을 사용하지만 기존 데이터는 다시 작성되지 않습니다.

다음 예제와 같이 키를 설정하여 클러스터링을 해제할 NONE수도 있습니다.

ALTER TABLE table_name CLUSTER BY NONE;

클러스터 키를 설정해 NONE 도 이미 클러스터된 데이터는 다시 작성되지 않지만 향후 OPTIMIZE 작업에서 클러스터링 키를 사용할 수 없습니다.

테이블이 클러스터되는 방법 보기

다음 예제와 같이 명령을 사용하여 DESCRIBE 테이블의 클러스터링 키를 볼 수 있습니다.

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

액체 클러스터링이 있는 테이블에 대한 호환성

Databricks Runtime 14.1 이상에서 Liquid 클러스터링을 사용하여 만든 테이블은 기본적으로 v2 검사점을 사용합니다. Databricks Runtime 13.3 LTS 이상에서 v2 검사점을 사용하여 테이블을 읽고 쓸 수 있습니다.

Databricks Runtime 12.2 LTS 이상에서 액체 클러스터링이 있는 테이블을 읽으려면 v2 검사점을 사용하지 않도록 설정하고 테이블 프로토콜을 다운그레이드할 수 있습니다. 델타 테이블 기능 삭제를 참조하세요.

제한 사항

다음 제한 사항이 존재합니다.

  • Databricks Runtime 15.1 이하에서는 쓰기 시 클러스터링이 필터, 조인 또는 집계를 포함하는 원본 쿼리를 지원하지 않습니다.
  • 구조적 스트리밍 워크로드는 쓰기 시 클러스터링을 지원하지 않습니다.
  • 구조적 스트리밍 쓰기를 사용하여 액체 클러스터링을 사용하도록 설정된 테이블을 만들 수 없습니다. 구조적 스트리밍을 사용하여 액체 클러스터링을 사용하도록 설정된 기존 테이블에 데이터를 쓸 수 있습니다.