Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Kommandot OPTIMIZE skriver om datafiler för att förbättra datalayouten för både Delta Lake- och Apache Iceberg-tabeller. För tabeller med flytande klustring aktiverat OPTIMIZE skriver du om datafiler för att gruppera data efter flytande klustringsnycklar. För tabeller med definierade partitioner utförs filkomprimering och datalayout i partitioner.
Förutsägande optimering körs OPTIMIZE automatiskt på hanterade Unity Catalog-tabeller. Databricks rekommenderar att du aktiverar förutsägande optimering för alla hanterade Unity Catalog-tabeller för att förenkla dataunderhållet och minska lagringskostnaderna. Se Förutsägande optimering för hanterade Unity Catalog-tabeller.
Delta Lake-tabeller utan flytande klustring kan eventuellt innehålla en ZORDER BY sats för att förbättra dataklustring vid omskrivning. Apache Iceberg-tabeller använder klustrings- och sorteringsstrategier i stället för ZORDER. Databricks rekommenderar att du använder flytande kluster i stället för partitioner, ZORDEReller andra metoder för datalayout.
Se även OPTIMIZE.
Important
I Databricks Runtime 16.0 och senare kan du använda OPTIMIZE FULL för att framtvinga relustering för tabeller med flytande klustring aktiverat. Se Framtvinga omargruppering.
Syntaxexempel
Utlös komprimering genom att köra OPTIMIZE kommandot.
SQL
OPTIMIZE table_name
Python
Python DeltaTable-API:et är Delta Lake-specifikt.
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Scala
Scala DeltaTable-API:et är Delta Lake-specifikt.
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Om du har en stor mängd data och bara vill optimera en delmängd av den anger du ett valfritt partitionspredikat med hjälp av WHERE:
SQL
OPTIMIZE table_name WHERE date >= '2022-11-18'
Python
Python DeltaTable-API:et är Delta Lake-specifikt.
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Scala
Scala DeltaTable-API:et är Delta Lake-specifikt.
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Beakta följande information om packning i behållare:
- Optimering av behållarförpackning är idempotent, vilket innebär att om den körs två gånger på samma datauppsättning har den andra körningen ingen effekt.
- Bin-packing syftar till att skapa jämnt fördelade datafiler med avseende på lagringsstorlek, men inte nödvändigtvis sett till antalet tupler per fil. De två åtgärderna är dock ofta korrelerade.
Läsare av Delta Lake-tabeller använder ögonblicksbildisolering, vilket innebär att de inte avbryts när OPTIMIZE onödiga filer tas bort från transaktionsloggen. Eftersom OPTIMIZE gör inga dataändringar i tabellen, har en läsning före och efter en OPTIMIZE samma resultat. Prestanda OPTIMIZE i en tabell som är en strömmande källa påverkar inte några aktuella eller framtida strömmar med den här tabellen som källa.
OPTIMIZE returnerar filstatistiken (min, max, total och så vidare) för de filer som tagits bort och de filer som lagts till av åtgärden. Optimeringsstatistik innehåller även statistik för Z-sortering, antalet batchar och partitioner som optimerats.
Du kan också komprimera små filer automatiskt med automatisk komprimering. Se Automatisk komprimering.
Rekommenderad frekvens att köra OPTIMIZE
Aktivera förutsägande optimering för hanterade Unity Catalog-tabeller för att säkerställa att OPTIMIZE körs automatiskt när det är kostnadseffektivt.
När du väljer vilken frekvens som ska köras OPTIMIZEfinns det en kompromiss mellan prestanda och kostnad. Kör OPTIMIZE oftare för bättre frågeprestanda för slutanvändare. Detta medför en högre kostnad på grund av den ökade resursanvändningen. För att optimera kostnaden kör du den mindre ofta.
Databricks rekommenderar att du börjar med att köra OPTIMIZE dagligen och sedan justera frekvensen för att balansera kostnads- och prestandaavvägningar.
Rekommenderade instanstyper för OPTIMIZE
Båda åtgärderna är processorintensiva och innebär stora mängder avkodning och kodning av Parquet-data.
Databricks rekommenderar beräkningsoptimerade instanstyper.
OPTIMIZE drar också nytta av anslutna SSD:er.