Arbeta med Delta Lake-tabellhistorik
Varje åtgärd som ändrar en Delta Lake-tabell skapar en ny tabellversion. Du kan använda historikinformation för att granska åtgärder, återställa en tabell eller köra frågor mot en tabell vid en viss tidpunkt med hjälp av tidsresor.
Kommentar
I Databricks rekommenderas inte att du använder Delta Lake-tabellhistorik som långsiktig säkerhetskopieringslösning för dataarkivering. I Databricks rekommenderas att du bara använder de senaste 7 dagarna för tidsresor om du inte har angett ett större värde för kvarhållningsinställningar för både data och loggar.
Hämta historik för deltatabell
Du kan hämta information, inklusive åtgärder, användare och tidsstämpel för varje skrivning till en Delta-tabell genom att köra history
kommandot . Åtgärderna returneras i omvänd kronologisk ordning.
Kvarhållning av tabellhistorik bestäms av tabellinställningen delta.logRetentionDuration
, som är 30 dagar som standard.
Kommentar
Tidsresor och tabellhistorik styrs av olika tröskelvärden för kvarhållning. Läs mer i Vad är Delta Lake-tidsresor?.
DESCRIBE HISTORY table_name -- get the full history of the table
DESCRIBE HISTORY table_name LIMIT 1 -- get the last operation only
Information om Spark SQL-syntax finns i BESKRIVA HISTORIK.
Se Delta Lake API-dokumentationen för Scala/Java/Python-syntaxinformation.
Katalogutforskaren innehåller en visuell vy över den här detaljerade tabellinformationen och historiken för Delta-tabeller. Förutom tabellschemat och exempeldata kan du klicka på fliken Historik för att se tabellhistoriken som visas med DESCRIBE HISTORY
.
Historikschema
Utdata för åtgärden history
har följande kolumner.
Column | Type | Beskrivning |
---|---|---|
version | lång | Tabellversion som genereras av åtgärden. |
timestamp | timestamp | När den här versionen har checkats in. |
Användar-ID | sträng | ID för användaren som körde åtgärden. |
userName | sträng | Namnet på den användare som körde åtgärden. |
operation | sträng | Namnet på åtgärden. |
operationParameters | map | Parametrar för åtgärden (till exempel predikat.) |
jobb | Struct | Information om jobbet som körde åtgärden. |
notebook-fil | Struct | Information om notebook-filen som åtgärden kördes från. |
clusterId | sträng | ID för klustret där åtgärden kördes. |
readVersion | lång | Version av tabellen som lästes för att utföra skrivåtgärden. |
isolationLevel | sträng | Isoleringsnivå som används för den här åtgärden. |
isBlindAppend | boolean | Om den här åtgärden har bifogat data. |
operationMetrics | map | Mått för åtgärden (till exempel antal rader och filer som ändrats.) |
userMetadata | sträng | Användardefinierade incheckningsmetadata om det har angetts |
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
|version| timestamp|userId|userName|operation| operationParameters| job|notebook|clusterId|readVersion| isolationLevel|isBlindAppend| operationMetrics|
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
| 5|2019-07-29 14:07:47| ###| ###| DELETE|[predicate -> ["(...|null| ###| ###| 4|WriteSerializable| false|[numTotalRows -> ...|
| 4|2019-07-29 14:07:41| ###| ###| UPDATE|[predicate -> (id...|null| ###| ###| 3|WriteSerializable| false|[numTotalRows -> ...|
| 3|2019-07-29 14:07:29| ###| ###| DELETE|[predicate -> ["(...|null| ###| ###| 2|WriteSerializable| false|[numTotalRows -> ...|
| 2|2019-07-29 14:06:56| ###| ###| UPDATE|[predicate -> (id...|null| ###| ###| 1|WriteSerializable| false|[numTotalRows -> ...|
| 1|2019-07-29 14:04:31| ###| ###| DELETE|[predicate -> ["(...|null| ###| ###| 0|WriteSerializable| false|[numTotalRows -> ...|
| 0|2019-07-29 14:01:40| ###| ###| WRITE|[mode -> ErrorIfE...|null| ###| ###| null|WriteSerializable| true|[numFiles -> 2, n...|
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
Kommentar
- Några av de andra kolumnerna är inte tillgängliga om du skriver till en Delta-tabell med hjälp av följande metoder:
- Kolumner som läggs till i framtiden läggs alltid till efter den sista kolumnen.
Åtgärdsmåttnycklar
Åtgärden history
returnerar en samling åtgärdsmått i kolumnkartan operationMetrics
.
I följande tabeller visas mappningsnyckeldefinitionerna efter åtgärd.
Åtgärd | Måttnamn | beskrivning |
---|---|---|
WRITE, CREATE TABLE AS SELECT, REPLACE TABLE AS SELECT, COPY INTO | ||
numFiles | Antal filer som skrivits. | |
numOutputBytes | Storlek i byte för det skriftliga innehållet. | |
numOutputRows | Antal rader som skrivits. | |
DIREKTUPPSPELNINGSUPPDATERING | ||
numAddedFiles | Antal filer som har lagts till. | |
numRemovedFiles | Antal borttagna filer. | |
numOutputRows | Antal rader som skrivits. | |
numOutputBytes | Storleken på skrivning i byte. | |
DELETE | ||
numAddedFiles | Antal filer som har lagts till. Tillhandahålls inte när partitioner i tabellen tas bort. | |
numRemovedFiles | Antal borttagna filer. | |
numDeletedRows | Antal borttagna rader. Tillhandahålls inte när partitioner i tabellen tas bort. | |
numCopiedRows | Antal rader som kopierats i processen för att ta bort filer. | |
executionTimeMs | Tiden det tar att köra hela åtgärden. | |
scanTimeMs | Det tar tid att söka igenom filerna efter matchningar. | |
rewriteTimeMs | Tiden det tar att skriva om de matchade filerna. | |
TRUNCATE | ||
numRemovedFiles | Antal borttagna filer. | |
executionTimeMs | Tiden det tar att köra hela åtgärden. | |
SLÅ IHOP | ||
numSourceRows | Antal rader i källdataramen. | |
numTargetRowsInserted | Antal rader som infogats i måltabellen. | |
numTargetRowsUpdated | Antal rader som har uppdaterats i måltabellen. | |
numTargetRowsDeleted | Antal rader som tagits bort i måltabellen. | |
numTargetRows Kopierade | Antal kopierade målrader. | |
numOutputRows | Totalt antal rader som skrivits ut. | |
numTargetFilesLägg till | Antal filer som har lagts till i mottagare(mål). | |
numTargetFilesRemoved | Antal filer som tagits bort från mottagare(mål). | |
executionTimeMs | Tiden det tar att köra hela åtgärden. | |
scanTimeMs | Det tar tid att söka igenom filerna efter matchningar. | |
rewriteTimeMs | Tiden det tar att skriva om de matchade filerna. | |
UPDATE | ||
numAddedFiles | Antal filer som har lagts till. | |
numRemovedFiles | Antal borttagna filer. | |
numUpdatedRows | Antal rader som har uppdaterats. | |
numCopiedRows | Antal rader som precis kopierats över under uppdateringsprocessen av filer. | |
executionTimeMs | Tiden det tar att köra hela åtgärden. | |
scanTimeMs | Det tar tid att söka igenom filerna efter matchningar. | |
rewriteTimeMs | Tiden det tar att skriva om de matchade filerna. | |
FSCK | numRemovedFiles | Antal borttagna filer. |
KONVERTERA | numConvertedFiles | Antal Parquet-filer som har konverterats. |
OPTIMIZE | ||
numAddedFiles | Antal filer som har lagts till. | |
numRemovedFiles | Antal filer som optimerats. | |
numAddedBytes | Antal byte som lagts till efter att tabellen har optimerats. | |
numRemovedBytes | Antal borttagna byte. | |
minFileSize | Storleken på den minsta filen efter att tabellen har optimerats. | |
p25FileSize | Storleken på den 25:e percentilfilen efter att tabellen har optimerats. | |
p50FileSize | Medianfilstorlek efter att tabellen har optimerats. | |
p75FileSize | Storleken på den 75:e percentilfilen efter att tabellen har optimerats. | |
maxFileSize | Storleken på den största filen efter att tabellen har optimerats. | |
CLONE | ||
sourceTableSize | Storlek i byte för källtabellen i den version som klonas. | |
sourceNumOfFiles | Antal filer i källtabellen i den version som klonas. | |
numRemovedFiles | Antal filer som tagits bort från måltabellen om en tidigare Delta-tabell ersattes. | |
removedFilesSize | Total storlek i byte för de filer som tagits bort från måltabellen om en tidigare Delta-tabell ersattes. | |
numCopiedFiles | Antal filer som kopierades till den nya platsen. 0 för grunda kloner. | |
kopieradeFilesSize | Total storlek i byte för de filer som kopierades till den nya platsen. 0 för grunda kloner. | |
ÅTERSTÄLLA | ||
tableSizeAfterRestore | Tabellstorlek i byte efter återställning. | |
numOfFilesAfterRestore | Antal filer i tabellen efter återställningen. | |
numRemovedFiles | Antal filer som tagits bort av återställningsåtgärden. | |
numRestoredFiles | Antal filer som har lagts till som ett resultat av återställningen. | |
removedFilesSize | Storlek i byte av filer som tagits bort av återställningen. | |
restoredFilesSize | Storlek i byte av filer som lagts till av återställningen. | |
VACUUM | ||
numDeletedFiles | Antal borttagna filer. | |
numVacuumedDirectories | Antal dammsugna kataloger. | |
numFilesToDelete | Antal filer som ska tas bort. |
Vad är Delta Lake-tidsresor?
Delta Lake-tidsresor stöder frågor mot tidigare tabellversioner baserat på tidsstämpel eller tabellversion (som registrerats i transaktionsloggen). Du kan använda tidsresor för program, till exempel följande:
- Återskapa analyser, rapporter eller utdata (till exempel utdata från en maskininlärningsmodell). Detta kan vara användbart för felsökning eller granskning, särskilt i reglerade branscher.
- Skriva komplexa temporala frågor.
- Åtgärda misstag i dina data.
- Tillhandahålla ögonblicksbildisolering för en uppsättning frågor för snabbväxande tabeller.
Viktigt!
Tabellversioner som är tillgängliga med tidsresor bestäms av en kombination av kvarhållningströskeln för transaktionsloggfiler och frekvensen och den angivna kvarhållningen för VACUUM
åtgärder. Om du kör VACUUM
dagligen med standardvärdena är 7 dagars data tillgängliga för tidsresor.
Syntax för Delta-tidsresor
Du kör frågor mot en Delta-tabell med tidsåtgång genom att lägga till en sats efter tabellnamnspecifikationen.
timestamp_expression
kan vara något av följande:'2018-10-18T22:15:12.013Z'
, det vill: en sträng som kan gjutas till en tidsstämpelcast('2018-10-18 13:36:32 CEST' as timestamp)
'2018-10-18'
, det vill: en datumsträngcurrent_timestamp() - interval 12 hours
date_sub(current_date(), 1)
- Andra uttryck som är eller kan gjutas till en tidsstämpel
version
är ett långt värde som kan hämtas från utdataDESCRIBE HISTORY table_spec
från .
Varken timestamp_expression
eller version
kan vara underfrågor.
Endast datum- eller tidsstämpelsträngar accepteras. Till exempel "2019-01-01"
och "2019-01-01T00:00:00.000Z"
. Se följande kod för exempelsyntax:
SQL
SELECT * FROM people10m TIMESTAMP AS OF '2018-10-18T22:15:12.013Z';
SELECT * FROM people10m VERSION AS OF 123;
Python
df1 = spark.read.option("timestampAsOf", "2019-01-01").table("people10m")
df2 = spark.read.option("versionAsOf", 123).table("people10m")
Du kan också använda syntaxen @
för att ange tidsstämpeln eller versionen som en del av tabellnamnet. Tidsstämpeln måste vara i yyyyMMddHHmmssSSS
format. Du kan ange en version efter @
genom att lägga till en v
till versionen. Se följande kod för exempelsyntax:
SQL
SELECT * FROM people10m@20190101000000000
SELECT * FROM people10m@v123
Python
spark.read.table("people10m@20190101000000000")
spark.read.table("people10m@v123")
Vad är kontrollpunkter för transaktionsloggar?
Delta Lake registrerar tabellversioner som JSON-filer i _delta_log
katalogen, som lagras tillsammans med tabelldata. För att optimera frågor om kontrollpunkter aggregerar Delta Lake tabellversioner till Parquet-kontrollpunktsfiler, vilket förhindrar att alla JSON-versioner av tabellhistoriken behöver läsas. Azure Databricks optimerar kontrollpunktsfrekvensen för datastorlek och arbetsbelastning. Användare bör inte behöva interagera direkt med kontrollpunkter. Kontrollpunktsfrekvensen kan komma att ändras utan föregående meddelande.
Konfigurera datakvarhållning för frågor om tidsresor
Om du vill köra frågor mot en tidigare tabellversion måste du behålla både loggen och datafilerna för den versionen.
Datafiler tas bort när VACUUM
de körs mot en tabell. Delta Lake hanterar borttagning av loggfiler automatiskt efter kontrollpunktstabellversioner.
Eftersom de flesta Delta-tabeller har VACUUM
körts mot dem regelbundet bör punkt-i-tid-frågor respektera kvarhållningströskeln för VACUUM
, vilket är 7 dagar som standard.
För att öka tröskelvärdet för datakvarhållning för Delta-tabeller måste du konfigurera följande tabellegenskaper:
delta.logRetentionDuration = "interval <interval>"
: styr hur länge historiken för en tabell sparas. Standardvärdet ärinterval 30 days
.delta.deletedFileRetentionDuration = "interval <interval>"
: anger tröskelvärdetVACUUM
som används för att ta bort datafiler som inte längre refereras till i den aktuella tabellversionen. Standardvärdet ärinterval 7 days
.
Du kan ange Delta-egenskaper när tabellen skapas eller ange dem med en ALTER TABLE
instruktion. Se Referens för egenskaper för Delta-tabell.
Kommentar
Du måste ange båda dessa egenskaper för att säkerställa att tabellhistoriken bevaras under längre tid för tabeller med frekventa VACUUM
åtgärder. Om du till exempel vill få åtkomst till 30 dagars historiska data anger du delta.deletedFileRetentionDuration = "interval 30 days"
(som matchar standardinställningen för delta.logRetentionDuration
).
Om du ökar tröskelvärdet för datakvarhållning kan lagringskostnaderna öka i takt med att fler datafiler underhålls.
Återställa en Delta-tabell till ett tidigare tillstånd
Du kan återställa en Delta-tabell till dess tidigare tillstånd med hjälp RESTORE
av kommandot . En Delta-tabell underhåller internt historiska versioner av tabellen som gör att den kan återställas till ett tidigare tillstånd.
En version som motsvarar det tidigare tillståndet eller en tidsstämpel för när det tidigare tillståndet skapades stöds som alternativ med kommandot RESTORE
.
Viktigt!
- Du kan återställa en redan återställd tabell.
- Du kan återställa en klonad tabell.
- Du måste ha
MODIFY
behörighet för tabellen som återställs. - Du kan inte återställa en tabell till en äldre version där datafilerna togs bort manuellt eller av
vacuum
. Det går fortfarande att återställa till den här versionen delvis omspark.sql.files.ignoreMissingFiles
den är inställd påtrue
. - Tidsstämpelformatet för återställning till ett tidigare tillstånd är
yyyy-MM-dd HH:mm:ss
. Endast en date(yyyy-MM-dd
)-sträng stöds också.
RESTORE TABLE target_table TO VERSION AS OF <version>;
RESTORE TABLE target_table TO TIMESTAMP AS OF <timestamp>;
Syntaxinformation finns i ÅTERSTÄLL.
Viktigt!
Återställning anses vara en dataförändrande åtgärd. Delta Lake-loggposter som lagts till av RESTORE
kommandot innehåller dataChange inställt på true. Om det finns ett underordnat program, till exempel ett strukturerat direktuppspelningsjobb som bearbetar uppdateringarna till en Delta Lake-tabell, betraktas posterna i dataändringsloggen som lagts till av återställningsåtgärden som nya datauppdateringar, och bearbetning av dem kan resultera i dubbletter av data.
Till exempel:
Tabellversion | Åtgärd | Deltalogguppdateringar | Poster i uppdateringar av dataändringsloggar |
---|---|---|---|
0 | INSERT | AddFile(/path/to/file-1, dataChange = true) | (namn = Viktor, ålder = 29, (namn = George, ålder = 55) |
1 | INSERT | AddFile(/path/to/file-2, dataChange = true) | (namn = George, ålder = 39) |
2 | OPTIMIZE | AddFile(/path/to/file-3, dataChange = false), RemoveFile(/path/to/file-1), RemoveFile(/path/to/file-2) | (Inga poster eftersom Optimera komprimering inte ändrar data i tabellen) |
3 | RESTORE(version=1) | RemoveFile(/path/to/file-3), AddFile(/path/to/file-1, dataChange = true), AddFile(/path/to/file-2, dataChange = true) | (namn = Viktor, ålder = 29), (namn = George, ålder = 55), (namn = George, ålder = 39) |
I föregående exempel RESTORE
resulterar kommandot i uppdateringar som redan visades när deltatabellversion 0 och 1 lästes. Om en strömmande fråga läste den här tabellen betraktas dessa filer som nyligen tillagda data och bearbetas igen.
Återställa mått
RESTORE
rapporterar följande mått som en dataram på en rad när åtgärden är klar:
table_size_after_restore
: Tabellens storlek efter återställningen.num_of_files_after_restore
: Antalet filer i tabellen efter återställningen.num_removed_files
: Antal filer som tagits bort (logiskt borttagna) från tabellen.num_restored_files
: Antal filer som återställts på grund av återställning.removed_files_size
: Total storlek i byte för de filer som tas bort från tabellen.restored_files_size
: Total storlek i byte för de filer som återställs.
Exempel på användning av Delta Lake-tidsresor
Åtgärda oavsiktliga borttagningar till en tabell för användaren
111
:INSERT INTO my_table SELECT * FROM my_table TIMESTAMP AS OF date_sub(current_date(), 1) WHERE userId = 111
Åtgärda oavsiktliga felaktiga uppdateringar av en tabell:
MERGE INTO my_table target USING my_table TIMESTAMP AS OF date_sub(current_date(), 1) source ON source.userId = target.userId WHEN MATCHED THEN UPDATE SET *
Fråga antalet nya kunder som lagts till under den senaste veckan.
SELECT count(distinct userId) FROM my_table - ( SELECT count(distinct userId) FROM my_table TIMESTAMP AS OF date_sub(current_date(), 7))
Hur hittar jag den senaste incheckningens version i Spark-sessionen?
Om du vill hämta versionsnumret för den senaste incheckningen som skrivits av den aktuella SparkSession
i alla trådar och alla tabeller frågar du SQL-konfigurationen spark.databricks.delta.lastCommitVersionInSession
.
SQL
SET spark.databricks.delta.lastCommitVersionInSession
Python
spark.conf.get("spark.databricks.delta.lastCommitVersionInSession")
Scala
spark.conf.get("spark.databricks.delta.lastCommitVersionInSession")
Om inga incheckningar har gjorts av SparkSession
returnerar frågan till nyckeln ett tomt värde.
Kommentar
Om du delar samma SparkSession
sak i flera trådar liknar det att dela en variabel mellan flera trådar. Du kan nå konkurrensförhållanden eftersom konfigurationsvärdet uppdateras samtidigt.