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

Important

Delta Lake liquid 클러스터링 Databricks Runtime 13.3 이상의 공개 미리 보기에서 사용할 수 있습니다. Liquid 클러스터링 대한 일부 지원은 Databricks Runtime 12.2 LTS 이상에 있습니다. 액체 클러스터링 있는 테이블의 호환성을 참조하세요.

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

Warning

Liquid 클러스터링 사용하도록 설정된 Delta 테이블을 만들거나 쓰려면 OPTIMIZE Databricks Runtime 13.3 LTS 이상이 필요합니다.

참고 항목

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

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

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

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

액체 클러스터링 사용

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

liquid 클러스터링 사용하도록 설정하려면 아래 예제와 같이 테이블 만들기 문에 구를 추가 CLUSTER BY 합니다.

참고 항목

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

SQL

-- Create an empty table
CREATE TABLE table1(col0 int, col1 string) USING DELTA 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.format("delta").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.format("delta").clusterBy("col0").saveAsTable("table2")

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

Warning

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

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

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

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

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

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

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

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

  • 날짜
  • 타임스탬프
  • TimestampNTZ(Databricks Runtime 14.3 LTS 이상 필요)
  • 문자열
  • 정수
  • Long
  • Short
  • Float
  • 두 배
  • 소수
  • Byte
  • Boolean

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

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

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

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

대부분의 작업은 쓰기에 데이터를 자동으로 클러스터하지 않습니다. 쓰기에 클러스터되는 작업에는 다음이 포함됩니다.

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

참고 항목

쓰기 시 클러스터링이 가장 적합한 애플리케이션이며 다음과 같은 상황에서는 적용되지 않습니다.

  • 쓰기 작업이 512GB의 데이터를 초과하는 경우
  • 하위 쿼리에 SELECT 변환, 필터 또는 조인이 포함된 경우
  • 프로젝시된 열이 원본 테이블과 같지 않은 경우

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

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

클러스터링 트리거하려면 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;

liquid 클러스터링 테이블의 호환성

Databricks는 액체 클러스터링 사용하도록 설정된 테이블에서 읽거나 쓰는 모든 워크로드에 Databricks Runtime 13.3 LTS 이상을 사용하는 것이 좋습니다.

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

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

제한 사항

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

  • 클러스터링 키에 대해 수집된 통계가 있는 열만 지정할 수 있습니다. 기본적으로 Delta 테이블의 처음 32개 열에는 수집된 통계가 있습니다.
  • 최대 4개의 열을 클러스터링 키로 지정할 수 있습니다.
  • 구조적 스트리밍 워크로드는 쓰기 시 클러스터링을 지원하지 않습니다.