Bästa praxis

Den här artikeln beskriver metod tips när du använder delta Lake.

Tillhandahåll tips för dataplatser

Om du förväntar dig att en kolumn ofta ska användas i frågesyntaxen och om den kolumnen har hög kardinalitet (det vill säga ett stort antal distinkta värden) använder du Z-ORDER BY . Delta Lake placerar automatiskt data i filerna baserat på kolumnvärdena och använder layoutinformation för att hoppa över irrelevanta data vid frågor.

Mer information finns i Z-ordning (Multi-dimensionell klustring).

Välja rätt partitionskolumn

Du kan partitionera en delta tabell med en kolumn. Den oftast använda partitionstabellen är date . Följ de här två reglerna för tummen för att bestämma vilken kolumn som ska partitioneras genom att:

  • Om en kolumns kardinalitet är mycket hög, ska du inte använda den kolumnen för partitionering. Om du till exempel partitionerar efter en kolumn userId och om det kan finnas 1 miljon distinkta användar-ID: n, är det en felaktig partitionerings strategi.
  • Data mängd i varje partition: du kan partitionera efter en kolumn om du förväntar dig att data i partitionen ska vara minst 1 GB.

Komprimera filer

Om du skriver data kontinuerligt till en delta tabell tar det längre tid att ackumulera ett stort antal filer, särskilt om du lägger till data i små batchar. Detta kan ha en negativ effekt på effektiviteten i tabell läsningar, och det kan också påverka fil systemets prestanda. Vi rekommenderar att ett stort antal små filer skrivs om till ett mindre antal större filer regelbundet. Detta kallas komprimering.

Du kan komprimera en tabell med hjälp av kommandot Optimize .

Ersätta innehållet eller schemat för en tabell

Ibland kanske du vill ersätta en delta tabell. Exempel:

  • Du upptäcker att data i tabellen är felaktiga och vill ersätta innehållet.
  • Du vill skriva om hela tabellen för att göra inkompatibla schema ändringar (släpp kolumner eller ändra kolumn typer).

Du kan ta bort hela katalogen i en delta tabell och skapa en ny tabell på samma sökväg, men det rekommenderas inte eftersom:

  • Det är inte effektivt att ta bort en katalog. En katalog som innehåller mycket stora filer kan ta flera timmar eller till och med dagar att ta bort.
  • Du förlorar allt innehåll i de borttagna filerna. Det är svårt att återställa om du tar bort fel tabell.
  • Borttagning av katalogen är inte atomisk. När du tar bort tabellen en samtidig fråga som läser tabellen kan det hända att en del av tabellen inte kan visas.

Om du inte behöver ändra tabellens schema kan du ta bort data från en delta tabell och infoga nya data eller Uppdatera tabellen för att åtgärda felaktiga värden.

Om du vill ändra tabellens schema kan du ersätta hela tabellen. Exempel:

Python

dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .partitionBy(<your-partition-columns>) \
  .saveAsTable("<your-table>") # Managed table
dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .option("path", "<your-table-path>") \
  .partitionBy(<your-partition-columns>) \
  .saveAsTable("<your-table>") # External table

SQL

REPLACE TABLE <your-table> USING DELTA PARTITIONED BY (<your-partition-columns>) AS SELECT ... -- Managed table
REPLACE TABLE <your-table> USING DELTA PARTITIONED BY (<your-partition-columns>) LOCATION "<your-table-path>" AS SELECT ... -- External table

Scala

dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .partitionBy(<your-partition-columns>)
  .saveAsTable("<your-table>") // Managed table
dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .option("path", "<your-table-path>")
  .partitionBy(<your-partition-columns>)
  .saveAsTable("<your-table>") // External table

Det finns flera fördelar med den här metoden:

  • Det går mycket snabbare att skriva över en tabell eftersom det inte behövs att lista katalogen rekursivt eller ta bort några filer.
  • Den gamla versionen av tabellen finns fortfarande. Om du tar bort fel tabell kan du enkelt hämta gamla data med hjälp av res tiden.
  • Det är en atomisk åtgärd. Samtidiga frågor kan fortfarande läsa tabellen när du tar bort tabellen.
  • På grund av en delta Lake syra-transaktion garanterar detta att tabellen är i sitt tidigare tillstånd om det inte går att skriva över tabellen.

Om du vill ta bort gamla filer för att spara lagrings kostnader efter överskrivning av tabellen kan du dessutom använda vakuum för att ta bort dem. Den är optimerad för fil borttagning och är vanligt vis snabbare än att ta bort hela katalogen.