Optimize datafilutformning
Prediktiv optimering körs automatiskt OPTIMIZE
på Unity Catalog hanterad tables. Databricks rekommenderar att du aktiverar förutsägande optimering för alla Unity-Catalog hanterade tables för att förenkla dataunderhållet och minska lagringskostnaderna. Se Förutsägelseoptimering för Unity Catalog hanterad tables.
Kommandot OPTIMIZE
skriver om datafiler för att förbättra datalayouten för Delta tables. För tables med flytande klustring aktiverat skriver OPTIMIZE
om datafiler för att gruppera data efter flytande klustringsnycklar. För tables med definierade partitioner utförs filkomprimering och datalayout i partitioner.
Tables utan flytande klustring kan eventuellt innehålla en ZORDER BY
-sats för att förbättra dataklustring vid omskrivning. Databricks rekommenderar att du använder flytande kluster i stället för partitioner, ZORDER
eller andra metoder för datalayout.
Se OPTIMIZE.
Viktig
I Databricks Runtime 16.0 och senare kan du använda OPTIMIZE FULL
för att framtvinga relustering för tables med flytande klustring aktiverat. Se Tvångsomgruppering för alla poster.
Syntaxexempel
Du utlöser komprimering genom att OPTIMIZE
köra kommandot:
SQL
OPTIMIZE table_name
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().executeCompaction()
Scala
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 optimize en delmängd av den kan du ange ett valfritt partition predikat med hjälp av WHERE
:
SQL
OPTIMIZE table_name WHERE date >= '2022-11-18'
Python
from delta.tables import *
deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Scala
import io.delta.tables._
val deltaTable = DeltaTable.forName(spark, "table_name")
deltaTable.optimize().where("date='2021-11-18'").executeCompaction()
Kommentar
- Optimering av bin-packning ä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-packning syftar till att producera jämnt balanserade datafiler med avseende på deras storlek på disken, men inte nödvändigtvis antalet tupplar per fil. De två åtgärderna är dock oftast korrelerade.
- Python- och Scala-API:er för körning
OPTIMIZE
är tillgängliga från Databricks Runtime 11.3 LTS och senare.
Läsare av Delta tables använder snapshot-isolering, vilket innebär att de inte avbryts när OPTIMIZE
tar bort onödiga filer från transaktionsloggen.
OPTIMIZE
gör inga datarelaterade ändringar i table, så en läsning före och efter en OPTIMIZE
har samma resultat. Att utföra OPTIMIZE
på en table som är en strömmande källa påverkar inte några aktuella eller framtida strömmar som behandlar den här table som en 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.
Optimize statistik innehåller även Z-ordningsstatistik, antalet batchar och optimerade partitioner.
Du kan också komprimera små filer automatiskt med automatisk komprimering. Se Automatisk komprimering för Delta Lake på Azure Databricks.
Hur ofta ska jag köra OPTIMIZE
?
Aktivera förutsägelseoptimering för Unity Catalog hanterade tables för att säkerställa att OPTIMIZE
körs automatiskt när det är kostnadseffektivt.
När du väljer hur ofta du ska köra OPTIMIZE
finns det en kompromiss mellan prestanda och kostnad. Kör oftare för bättre frågeprestanda OPTIMIZE
för slutanvändare. Detta medför en högre kostnad på grund av den ökade resursanvändningen. För att minska kostnaden optimize, kör den mer sällan.
Databricks rekommenderar att du börjar med att köra OPTIMIZE
dagligen och sedan justera frekvensen för att balansera kostnads- och prestandaavvägningar.
Vilken är den bästa instanstypen att köra OPTIMIZE
(bin-packing och Z-Ordering) på?
Båda åtgärderna är CPU-intensiva åtgärder som utför stora mängder Parquet-avkodning och kodning.
Databricks rekommenderar beräkningsoptimerade instanstyper.
OPTIMIZE
fördelar med anslutna SSD:er.