Indeling van gegevensbestand optimaliseren

Met de OPTIMIZE opdracht worden gegevensbestanden herschreven om de gegevensindeling voor delta lake- en Apache Iceberg-tabellen te verbeteren. Voor tabellen waarvoor liquide clustering is ingeschakeld, OPTIMIZE herschrijft u gegevensbestanden om gegevens te groeperen door liquide clusteringsleutels. Voor tabellen met gedefinieerde partities worden bestandscompressie en gegevensindeling uitgevoerd binnen partities.

Voorspellende optimalisatie voert automatisch OPTIMIZE uit op beheerde tabellen van Unity Catalog. Databricks raadt aan voorspellende optimalisatie in te schakelen voor alle beheerde tabellen in Unity Catalog om het onderhoud van gegevens te vereenvoudigen en de opslagkosten te verlagen. Zie Voorspellende optimalisatie voor beheerde tabellen in Unity Catalog.

Delta Lake-tabellen zonder liquide clustering kunnen eventueel een ZORDER BY component bevatten om gegevensclustering te verbeteren bij herschrijven. Apache Iceberg-tabellen maken gebruik van clustering- en sorteerstrategieën in plaats van ZORDER. Databricks raadt het gebruik van liquide clustering aan in plaats van partities, ZORDERof andere benaderingen voor gegevensindeling.

Zie OPTIMIZE.

Belangrijk

In Databricks Runtime 16.0 en hoger kunt u OPTIMIZE FULL gebruiken om reclustering af te dwingen voor tabellen waarvoor liquide clustering is ingeschakeld. Zie Force reclustering.

Voorbeelden van syntaxis

Activeer compressie door het uitvoeren van de OPTIMIZE opdracht:

SQL

OPTIMIZE table_name

Python

De Python DeltaTable-API is Delta Lake-specifiek.

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()

Scala

De Scala DeltaTable API is specifiek voor Delta Lake.

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()

Als u een grote hoeveelheid gegevens hebt en alleen een subset ervan wilt optimaliseren, geeft u een optionele partitiepredicaat op met behulp van WHERE:

SQL

OPTIMIZE table_name WHERE date >= '2022-11-18'

Python

De Python DeltaTable-API is Delta Lake-specifiek.

from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Scala

De Scala DeltaTable API is specifiek voor Delta Lake.

import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()

Houd rekening met de volgende informatie voor bin-verpakking:

  • Optimalisatie van bin-inpakken is idempotent, wat betekent dat als deze twee keer op dezelfde gegevensset wordt uitgevoerd, de tweede keer uitvoeren geen effect heeft.
  • Bin-packing streeft ernaar om gegevensbestanden te produceren die evenwichtig verdeeld zijn qua opslaggrootte, maar niet noodzakelijkerwijs qua het aantal tuples per bestand. De twee metingen zijn echter vaak gecorreleerd.

Lezers van Delta Lake-tabellen maken gebruik van isolatie van momentopnamen, wat betekent dat ze niet worden onderbroken wanneer OPTIMIZE onnodige bestanden uit het transactielogboek worden verwijderd. Omdat OPTIMIZE geen gegevenswijzigingen in de tabel aanbrengt, levert een leesactie vóór en na een OPTIMIZE dezelfde resultaten op. Het uitvoeren OPTIMIZE van een tabel die een streamingbron is, heeft geen invloed op huidige of toekomstige streams met deze tabel als bron.

OPTIMIZE retourneert de bestandsstatistieken (min, max, totaal, enzovoort) voor de bestanden die zijn verwijderd en de bestanden die door de bewerking zijn toegevoegd. Statistieken optimaliseren bevat ook de Z-Ordering-statistieken, het aantal geoptimaliseerde batches en partities.

U kunt ook kleine bestanden automatisch comprimeren met automatische compressie. Zie Automatische compressie.

Schakel voorspellende optimalisatie in voor beheerde tabellen in Unity Catalog om ervoor te zorgen dat deze OPTIMIZE automatisch worden uitgevoerd wanneer deze rendabel zijn.

Wanneer u de frequentie kiest die moet worden uitgevoerd OPTIMIZE, is er een afweging tussen prestaties en kosten. Voor betere prestaties van query's van eindgebruikers voert u vaker uit OPTIMIZE . Hierdoor worden hogere kosten in rekening gebracht vanwege het toegenomen resourcegebruik. Om de kosten te optimaliseren, voer het minder vaak uit.

Databricks raadt aan om OPTIMIZE dagelijks uit te voeren en vervolgens de frequentie aan te passen om kosten en prestaties in balans te brengen.

Beide bewerkingen zijn processorintensief en vereisen grote hoeveelheden decodering en encodering van Parquet-gegevens.

Databricks raadt geoptimaliseerde exemplaartypen voor Compute aan. OPTIMIZE profiteert ook van gekoppelde SSD's.