Liquid clustering gebruiken voor Delta-tabellen

Belangrijk

Delta Lake liquid clustering is beschikbaar in openbare preview in Databricks Runtime 13.3 en hoger. Er bestaat enige ondersteuning voor liquide clustering in Databricks Runtime 12.2 LTS en hoger. Zie Compatibiliteit voor tabellen met vloeistofclustering.

Delta Lake liquid clustering vervangt tabelpartitionering en vereenvoudigt beslissingen over de gegevensindeling en ZORDER optimaliseert de queryprestaties. Liquid clustering biedt flexibiliteit om clustersleutels opnieuw te definiëren zonder bestaande gegevens te herschrijven, waardoor de gegevensindeling zich in de loop van de tijd kan ontwikkelen naast de analysebehoeften.

Waarschuwing

Databricks Runtime 13.3 LTS en hoger is vereist voor het maken, schrijven of OPTIMIZE Delta-tabellen waarvoor liquide clustering is ingeschakeld.

Notitie

Tabellen waarvoor liquide clustering is ingeschakeld, ondersteunen gelijktijdigheid op rijniveau in Databricks Runtime 13.3 LTS en hoger. Gelijktijdigheid op rijniveau is algemeen beschikbaar in Databricks Runtime 14.2 en hoger voor alle tabellen waarvoor verwijderingsvectoren zijn ingeschakeld. Bekijk isolatieniveaus en schrijfconflicten in Azure Databricks.

Waarvoor wordt vloeistofclustering gebruikt?

Databricks raadt vloeibare clustering aan voor alle nieuwe Delta-tabellen. Hier volgen enkele voorbeelden van scenario's die profiteren van clustering:

  • Tabellen die vaak worden gefilterd op kolommen met hoge kardinaliteit.
  • Tabellen met aanzienlijke asymmetrie in gegevensdistributie.
  • Tabellen die snel groeien en onderhoud en afstemming vereisen.
  • Tabellen met gelijktijdige schrijfvereisten.
  • Tabellen met toegangspatronen die na verloop van tijd veranderen.
  • Tabellen waarbij een typische partitiesleutel ertoe kan leiden dat de tabel te veel of te weinig partities bevat.

Liquid clustering inschakelen

U kunt een liquid cluster inschakelen voor een bestaande tabel of tijdens het maken van een tabel. Clustering is niet compatibel met partitionering of ZORDERen vereist dat de Azure Databricks-client alle indelings- en optimalisatiebewerkingen voor gegevens in uw tabel beheert. Zodra deze functie is ingeschakeld, voert u taken uit als normaal om incrementele clustergegevens uit te voeren OPTIMIZE . Zie Clustering activeren.

Als u liquide clustering wilt inschakelen, voegt u de woordgroep toe aan een instructie voor het CLUSTER BY maken van tabellen, zoals in de onderstaande voorbeelden:

Notitie

In Databricks Runtime 14.2 en hoger kunt u DataFrame-API's en DeltaTable-API's in Python of Scala gebruiken om liquide clustering in te schakelen.

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()

Waarschuwing

Tabellen die zijn gemaakt met liquide clustering ingeschakeld, hebben talloze Delta-tabelfuncties die zijn ingeschakeld bij het maken en gebruiken van Delta Writer versie 7 en lezer versie 3. U kunt de activering van sommige van deze functies overschrijven. Zie Standaardfunctie inschakelen (optioneel) overschrijven.

Tabelprotocolversies kunnen niet worden gedowngraded en tabellen waarvoor clustering is ingeschakeld, kunnen niet worden gelezen door Delta Lake-clients die niet alle ingeschakelde protocoltabelfuncties van Delta Reader ondersteunen. Zie Hoe beheert Azure Databricks de compatibiliteit van Delta Lake-functies?

In Databricks Runtime 13.3 LTS en hoger kunt u liquide clustering inschakelen voor een bestaande niet-gepartitioneerde Delta-tabel met behulp van de volgende syntaxis:

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

Standaardfunctie inschakelen overschrijven (optioneel)

U kunt standaardgedrag overschrijven dat Delta-tabelfuncties inschakelt tijdens het inschakelen van liquide clustering. Hiermee voorkomt u dat de lezer- en schrijfprotocollen die aan deze tabelfuncties zijn gekoppeld, worden bijgewerkt. U moet een bestaande tabel hebben om de volgende stappen uit te voeren:

  1. Hiermee ALTER TABLE stelt u de tabeleigenschap in waarmee een of meer functies worden uitgeschakeld. Als u bijvoorbeeld verwijderingsvectoren wilt uitschakelen, voert u het volgende uit:

    ALTER TABLE table_name SET TBLPROPERTIES ('delta.enableDeletionVectors' = false);
    
  2. Schakel vloeistofclustering in de tabel in door het volgende uit te voeren:

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

De volgende tabel bevat informatie over de Delta-functies die u kunt overschrijven en hoe het inschakelen van invloed is op de compatibiliteit met Databricks Runtime-versies.

Delta-functie Runtimecompatibiliteit Eigenschap voor het overschrijven van inschakeling Gevolgen van uitschakeling op liquide clustering
Verwijderingsvectoren Lees- en schrijfbewerkingen vereisen Databricks Runtime 12.2 lTS en hoger. 'delta.enableDeletionVectors' = false Gelijktijdigheid op rijniveau is uitgeschakeld, waardoor transacties en clusterbewerkingen waarschijnlijker conflicteren. Zie Schrijfconflicten met gelijktijdigheid op rijniveau.

DELETE, MERGEen UPDATE opdrachten kunnen langzamer worden uitgevoerd.
Rijtracering Schrijfbewerkingen vereisen Databricks Runtime 13.3 LTS en hoger. Kan worden gelezen uit elke Databricks Runtime-versie. 'delta.enableRowTracking' = false Gelijktijdigheid op rijniveau is uitgeschakeld, waardoor transacties en clusterbewerkingen waarschijnlijker conflicteren. Zie Schrijfconflicten met gelijktijdigheid op rijniveau.
Controlepunten V2 Lees- en schrijfbewerkingen vereisen Databricks Runtime 13.3 LTS en hoger. 'delta.checkpointPolicy' = 'classic' Geen invloed op het gedrag van liquide clustering.

Clusteringsleutels kiezen

Databricks raadt aan clustersleutels te kiezen op basis van veelgebruikte queryfilters. Clusteringsleutels kunnen in elke volgorde worden gedefinieerd. Als er twee kolommen zijn gecorreleerd, hoeft u er slechts een toe te voegen als clustersleutel.

Clustering ondersteunt de volgende gegevenstypen voor clusteringsleutels:

  • Datum
  • Tijdstempel
  • TimestampNTZ (vereist Databricks Runtime 14.3 LTS of hoger)
  • String
  • Geheel getal
  • Lang
  • Kort
  • Float
  • Dubbel
  • Decimal
  • Byte
  • Booleaanse waarde

Als u een bestaande tabel converteert, kunt u de volgende aanbevelingen overwegen:

Huidige techniek voor gegevensoptimalisatie Aanbeveling voor clustersleutels
Partitionering in Hive-stijl Gebruik partitiekolommen als clustersleutels.
Indexering van Z-volgorde Gebruik de ZORDER BY kolommen als clustersleutels.
Hive-stijl partitioneren en Z-volgorde Gebruik zowel partitiekolommen als ZORDER BY kolommen als clustersleutels.
Gegenereerde kolommen om kardinaliteit te verminderen (bijvoorbeeld datum voor een tijdstempel) Gebruik de oorspronkelijke kolom als clustersleutel en maak geen gegenereerde kolom.

Gegevens schrijven naar een geclusterde tabel

U moet een Delta Writer-client gebruiken die ondersteuning biedt voor alle delta-schrijfprotocoltabelfuncties die worden gebruikt door liquid clustering. In Azure Databricks moet u Databricks Runtime 13.3 LTS en hoger gebruiken.

De meeste bewerkingen clusteren niet automatisch gegevens bij schrijven. Bewerkingen die op schrijfbewerkingen worden uitgevoerd, zijn onder andere:

  • INSERT INTO bewerkingen
  • CTAS instructies
  • COPY INTO van Parquet-indeling
  • spark.write.format("delta").mode("append")

Notitie

Clustering bij schrijven is een best effort-toepassing en wordt niet toegepast in de volgende situaties:

  • Als een schrijfbewerking groter is dan 512 GB aan gegevens.
  • Als de SELECT subquery een transformatie, filter of join bevat.
  • Als de projectkolommen niet hetzelfde zijn als de brontabel.

Omdat niet alle bewerkingen liquide clustering toepassen, raadt OPTIMIZE Databricks vaak aan om ervoor te zorgen dat alle gegevens efficiënt zijn geclusterd.

Clustering activeren

Als u clustering wilt activeren, moet u Databricks Runtime 13.3 LTS of hoger gebruiken. Gebruik de OPTIMIZE opdracht in uw tabel, zoals in het volgende voorbeeld:

OPTIMIZE table_name;

Liquid clustering is incrementeel, wat betekent dat gegevens alleen worden herschreven als dat nodig is om tegemoet te komen aan gegevens die moeten worden geclusterd. Gegevensbestanden met clustersleutels die niet overeenkomen met de gegevens die moeten worden geclusterd, worden niet herschreven.

Voor de beste prestaties raadt Databricks aan om regelmatige OPTIMIZE taken te plannen voor het clusteren van gegevens. Voor tabellen met veel updates of invoegingen raadt Databricks aan om elke één of twee uur een OPTIMIZE taak te plannen. Omdat liquide clustering incrementeel is, worden de meeste OPTIMIZE taken voor geclusterde tabellen snel uitgevoerd.

Gegevens uit een geclusterde tabel lezen

U kunt gegevens lezen in een geclusterde tabel met behulp van een Delta Lake-client die leesverwijderingsvectoren ondersteunt. Neem voor de beste queryresultaten clustersleutels op in uw queryfilters, zoals in het volgende voorbeeld:

SELECT * FROM table_name WHERE cluster_key_column_name = "some_value";

Clusteringsleutels wijzigen

U kunt clustersleutels voor een tabel op elk gewenst moment wijzigen door een ALTER TABLE opdracht uit te voeren, zoals in het volgende voorbeeld:

ALTER TABLE table_name CLUSTER BY (new_column1, new_column2);

Wanneer u clustersleutels wijzigt, gebruiken volgende OPTIMIZE bewerkingen en schrijfbewerkingen de nieuwe clusteringbenadering, maar worden bestaande gegevens niet opnieuw geschreven.

U kunt clustering ook uitschakelen door de sleutels in te stellen op NONE, zoals in het volgende voorbeeld:

ALTER TABLE table_name CLUSTER BY NONE;

Als u clustersleutels instelt op NONE het niet herschrijven van gegevens die al zijn geclusterd, maar voorkomt u dat toekomstige OPTIMIZE bewerkingen clusteringsleutels gebruiken.

Bekijken hoe de tabel is geclusterd

U kunt opdrachten gebruiken DESCRIBE om de clustersleutels voor een tabel weer te geven, zoals in de volgende voorbeelden:

DESCRIBE TABLE table_name;

DESCRIBE DETAIL table_name;

Compatibiliteit voor tabellen met vloeibare clustering

Databricks raadt aan om Databricks Runtime 13.3 LTS of hoger te gebruiken voor alle workloads die tabellen lezen of schrijven waarvoor liquide clustering is ingeschakeld.

Tabellen die zijn gemaakt met liquide clustering in Databricks Runtime 14.1 en hoger, gebruiken standaard v2-controlepunten. U kunt tabellen lezen en schrijven met v2-controlepunten in Databricks Runtime 13.3 LTS en hoger.

U kunt v2-controlepunten uitschakelen en tabelprotocollen downgraden om tabellen te lezen met liquide clustering in Databricks Runtime 12.2 LTS en hoger. Zie Delta-tabelfuncties neerzetten.

Beperkingen

De volgende beperkingen gelden:

  • Je kunt alleen kolommen opgeven met statistieken die zijn verzameld voor clusteringsleutels. Standaard worden in de eerste 32 kolommen in een Delta-tabel statistieken verzameld.
  • Je kunt maximaal 4 kolommen opgeven als clusteringsleutels.
  • Workloads voor gestructureerd streamen bieden geen ondersteuning voor clustering bij schrijven.