Liquid clustering gebruiken voor Delta-tabellen
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.
Belangrijk
Databricks raadt aan om Databricks Runtime 15.2 en hoger te gebruiken voor alle tabellen waarvoor liquide clustering is ingeschakeld. Openbare preview-ondersteuning met beperkingen is beschikbaar in Databricks Runtime 13.3 LTS en hoger.
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 vloeistofclustering inschakelen voor een bestaande tabel of tijdens het maken van een tabel. Clustering is niet compatibel met partitionering of ZORDER
en vereist dat u Azure Databricks gebruikt om alle indelings- en optimalisatiebewerkingen voor gegevens in uw tabel te beheren. Nadat liquide clustering is ingeschakeld, voert u taken uit zoals gebruikelijk 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) 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()
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?
U kunt liquid 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:
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);
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 , MERGE en 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.
Je kunt maximaal 4 kolommen opgeven als clusteringsleutels. 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. Zie Kolommen voor Delta-statistieken opgeven.
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
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.
Bewerkingen die op schrijfbewerkingen worden uitgevoerd, zijn onder andere:
INSERT INTO
bewerkingenCTAS
enRTAS
instructiesCOPY INTO
van Parquet-indelingspark.write.mode("append")
Gestructureerde streaming-schrijfbewerkingen activeren nooit clustering bij schrijven. Aanvullende beperkingen zijn van toepassing. Zie beperkingen.
Clustering op schrijfbewerkingen wordt alleen geactiveerd wanneer gegevens in de transactie voldoen aan een drempelwaarde voor grootte. Deze drempelwaarden variëren per aantal clusterkolommen en zijn lager voor beheerde Unity Catalog-tabellen dan andere Delta-tabellen.
Aantal clusterkolommen | Drempelwaarde voor beheerde tabellen in Unity Catalog | Drempelwaarde voor andere Delta-tabellen |
---|---|---|
1 | 64 MB | 256 MB |
2 | 256 MB | 1 GB |
3 | 512 MB | 2 GB |
4 | 1 GB | 4 GB |
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
Voorspellende optimalisatie voert OPTIMIZE
automatisch opdrachten uit voor ingeschakelde tabellen. Zie Voorspellende optimalisatie voor beheerde tabellen in Unity Catalog.
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
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:
- In Databricks Runtime 15.1 en lager biedt clustering op schrijfbewerking geen ondersteuning voor bronquery's met filters, joins of aggregaties.
- Workloads voor gestructureerd streamen bieden geen ondersteuning voor clustering bij schrijven.
- U kunt geen tabel maken waarvoor liquid clustering is ingeschakeld met behulp van een Structured Streaming-schrijfbewerking. U kunt Structured Streaming gebruiken om gegevens naar een bestaande tabel te schrijven waarvoor liquide clustering is ingeschakeld.