Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Bei Apache Iceberg- und Delta Lake-Tabellen erstellt jeder Vorgang, der eine Tabelle ändert, eine neue Tabellenversion. Verwenden Sie Verlaufsinformationen zum Überwachen von Vorgängen, zum Zurücksetzen einer Tabelle oder zum Abfragen einer Tabelle zu einem bestimmten Zeitpunkt mithilfe von Zeitreisen.
Note
Databricks empfiehlt die Verwendung des Tabellenverlaufs nicht als langfristige Sicherungslösung für die Datenarchivierung. Verwenden Sie nur die letzten 7 Tage für Zeitreisevorgänge, es sei denn, Sie haben sowohl Daten- als auch Protokollaufbewahrungskonfigurationen auf einen größeren Wert festgelegt.
Tabellenverlauf abrufen
Führen Sie den DESCRIBE HISTORY Befehl aus, um Informationen einschließlich der Vorgänge, des Benutzers und des Zeitstempels für jeden Schreibvorgang in eine Tabelle abzurufen. Die Vorgänge werden in umgekehrter chronologischer Reihenfolge zurückgegeben.
Die Beibehaltung des Tabellenverlaufs wird durch die Tabelleneinstellung logRetentionDurationbestimmt, die standardmäßig auf 30 Tage festgelegt ist.
Note
Zeitreisen und Tabellenverlauf werden durch unterschiedliche Aufbewahrungsschwellenwerte gesteuert. Siehe Zeitreise.
DESCRIBE HISTORY table_name -- get the full history of the table
DESCRIBE HISTORY table_name LIMIT 1 -- get the last operation only
Details zur Spark SQL-Syntax finden Sie unter DESCRIBE HISTORY.
Details zur Syntax von Scala, Java und Python finden Sie in der Dokumentation zur Delta Lake-API.
Katalog-Explorer zeigt den Tabellenverlauf visuell auf der Registerkarte "Verlauf " an.
Verlaufsschema
Die Ausgabe des Vorgangs history enthält die folgenden Spalten.
| Column | Typ | Beschreibung |
|---|---|---|
| version | long |
Die vom Vorgang generierte Tabellenversion. |
| timestamp | timestamp |
Zeitpunkt, zu dem diese Version committet wurde. |
| userId | string |
Die ID des Benutzers, der den Vorgang ausgeführt hat. |
| userName | string |
Der Name des Benutzers, der den Vorgang ausgeführt hat. |
| operation | string |
Der Name des Vorgangs. |
| operationParameters | map |
Die Parameter des Vorgangs (z. B. Prädikate.) |
| job | struct |
Die Details des Lakeflow-Einzelvorgangs, der den Vorgang ausgeführt hat. Füllt nur für Commits, die aus einem Lakeflow-Einzelvorgang geschrieben wurden. Andernfalls, null. |
| notebook | struct |
Die Details des Databricks-Notizbuchs, aus dem der Vorgang ausgeführt wurde. Wird nur für Commits ausgefüllt, die in einem Databricks-Notebook erstellt wurden. Andernfalls, null. |
| clusterId | string |
Die ID des Clusters, auf dem der Vorgang ausgeführt wurde. |
| readVersion | long |
Die Version der Tabelle, die zum Ausführen des Schreibvorgangs gelesen wurde. |
| isolationLevel | string |
Die für diesen Vorgang verwendete Isolationsstufe. |
| isBlindAppend | boolean |
Gibt an, ob dieser Vorgang Daten angefügt hat. |
| operationMetrics | map |
Die Metriken des Vorgangs (z. B. Anzahl von Zeilen und Dateien geändert.) |
| Benutzermetadaten | string |
Die benutzerdefinierten Commit-Metadaten, falls angegeben. |
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
|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...|
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
Note
- Wenn Sie mithilfe der folgenden Methoden in eine Tabelle schreiben, stehen einige Spalten nicht zur Verfügung:
- Zukünftig hinzugefügte Spalten werden immer hinter der letzten Spalte hinzugefügt.
Verständnis partitionBy für Betriebsparameter
Das partitionBy Feld im Tabellenverlauf ist nur für CREATE- und OVERWRITE-Vorgänge sinnvoll, die das Partitionsschema einer Tabelle definieren oder ändern.
Bei Anfügevorgängen an vorhandene Tabellen (APPEND, INSERT, , UPDATEDELETE, MERGE) kann in diesem Feld je nach verwendeter Schreibmethode ([] vs .save()) ein leeres Array .saveAsTable() oder Partitionsspalten angezeigt werden.
Diese Inkonsistenz ist ein erwartetes Verhalten und wirkt sich nicht darauf aus, wie Daten in Partitionen geschrieben werden. Sie sollten sie nicht zum Überprüfen von Anfügevorgängen verwenden.
Beispiel
Betrachten Sie eine Tabelle, die von der date Spalte partitioniert wird. Wenn Sie die Tabelle erstellen, wird partitionBy mit folgenden Werten gefüllt:
df.write.format("delta") \
.partitionBy("date") \
.saveAsTable("sales_data")
Der CREATE-Vorgang im Verlauf zeigt Folgendes:
operationParameters: {
"mode": "ErrorIfExists",
"partitionBy": "[\"date\"]"
}
Wenn Sie Daten an diese Tabelle anhängen, zeigt partitionBy ein leeres Array an:
new_df.write.format("delta") \
.mode("append") \
.saveAsTable("sales_data")
Der APPEND-Vorgang zeigt:
operationParameters: {
"mode": "Append",
"partitionBy": "[]"
}
Es wird erwartet, dass der partitionBy Wert leer ist. Die Daten werden weiterhin basierend auf dem vorhandenen Partitionsschema der Tabelle in die richtigen Partitionen geschrieben. Bitte beachten Sie, dass .save() in einem Pfad in diesem Feld Partitionsspalten anzeigen kann; dieser Unterschied ist jedoch ein Implementierungsdetail und hat keinen Einfluss auf das Schreibverhalten.
Vorgangsmetriken
Die Operation history gibt eine Sammlung von Operationsmetriken in der Spaltenmap operationMetrics zurück.
In den folgenden Tabellen sind die Kartenschlüsseldefinitionen pro Vorgang aufgeführt.
WRITE, CREATE TABLE AS SELECT, REPLACE TABLE AS SELECT, COPY INTO
Die folgenden Metriken sind für diese Vorgänge verfügbar:
| Metrikname | Beschreibung |
|---|---|
numFiles |
Die Anzahl der geschriebenen Dateien. |
numOutputBytes |
Die Größe in Byte des geschriebenen Inhalts. |
numOutputRows |
Die Anzahl der geschriebenen Zeilen. |
STREAMING UPDATE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numAddedFiles |
Die Anzahl der hinzugefügten Dateien. |
numRemovedFiles |
Die Anzahl der entfernten Dateien. |
numOutputRows |
Die Anzahl der geschriebenen Zeilen. |
numOutputBytes |
Die Größe des Schreibzugriffs in Bytes. |
DELETE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numAddedFiles |
Die Anzahl der hinzugefügten Dateien. Wird nicht angegeben, wenn Partitionen der Tabelle gelöscht werden. |
numRemovedFiles |
Die Anzahl der entfernten Dateien. |
numDeletedRows |
Die Anzahl der entfernten Zeilen. Wird nicht angegeben, wenn Partitionen der Tabelle gelöscht werden. |
numCopiedRows |
Die Anzahl der Zeilen, die beim Löschen von Dateien kopiert wurden. |
executionTimeMs |
Die Zum Ausführen des gesamten Vorgangs benötigte Zeit. |
scanTimeMs |
Die zum Scannen der Dateien auf Übereinstimmungen benötigte Zeit. |
rewriteTimeMs |
Die Zeit, die zum Umschreiben der übereinstimmenden Dateien gedauert hat. |
TRUNCATE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numRemovedFiles |
Die Anzahl der entfernten Dateien. |
executionTimeMs |
Die Zum Ausführen des gesamten Vorgangs benötigte Zeit. |
MERGE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numSourceRows |
Die Anzahl der Zeilen im Quelldatenframe. |
numTargetRowsInserted |
Die Anzahl der Zeilen, die in die Zieltabelle eingefügt wurden. |
numTargetRowsUpdated |
Die Anzahl der Zeilen, die in der Zieltabelle aktualisiert wurden. |
numTargetRowsDeleted |
Die Anzahl der in der Zieltabelle gelöschten Zeilen. |
numTargetRowsCopied |
Die Anzahl der kopierten Zielzeilen. |
numOutputRows |
Die Gesamtzahl der geschriebenen Zeilen. |
numTargetFilesAdded |
Die Anzahl von Dateien, die der Senke (Ziel) hinzugefügt wurden. |
numTargetFilesRemoved |
Die Anzahl von Dateien, die aus der Senke (Ziel) entfernt wurden. |
executionTimeMs |
Die Zum Ausführen des gesamten Vorgangs benötigte Zeit. |
scanTimeMs |
Die zum Scannen der Dateien auf Übereinstimmungen benötigte Zeit. |
rewriteTimeMs |
Die Zeit, die zum Umschreiben der übereinstimmenden Dateien gedauert hat. |
UPDATE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numAddedFiles |
Die Anzahl der hinzugefügten Dateien. |
numRemovedFiles |
Die Anzahl der entfernten Dateien. |
numUpdatedRows |
Die Anzahl der aktualisierten Zeilen. |
numCopiedRows |
Die Anzahl von Zeilen, die beim Aktualisieren von Dateien gerade kopiert wurden. |
executionTimeMs |
Die Zum Ausführen des gesamten Vorgangs benötigte Zeit. |
scanTimeMs |
Die zum Scannen der Dateien auf Übereinstimmungen benötigte Zeit. |
rewriteTimeMs |
Die Zeit, die zum Umschreiben der übereinstimmenden Dateien gedauert hat. |
FSCK
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numRemovedFiles |
Die Anzahl der entfernten Dateien. |
CONVERT
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numConvertedFiles |
Die Anzahl der Parquet-Dateien, die konvertiert wurden. |
OPTIMIZE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numAddedFiles |
Die Anzahl der hinzugefügten Dateien. |
numRemovedFiles |
Die Anzahl der optimierten Dateien. |
numAddedBytes |
Die Anzahl der Bytes, die nach der Optimierung der Tabelle hinzugefügt wurden. |
numRemovedBytes |
Die Anzahl der entfernten Bytes. |
minFileSize |
Die Größe der kleinsten Datei, nachdem die Tabelle optimiert wurde. |
p25FileSize |
Die Größe der 25. Perzentildatei, nachdem die Tabelle optimiert wurde. |
p50FileSize |
Die Mediandateigröße, nachdem die Tabelle optimiert wurde. |
p75FileSize |
Die Größe der 75. Perzentildatei, nachdem die Tabelle optimiert wurde. |
maxFileSize |
Die Größe der größten Datei nach der Optimierung der Tabelle. |
CLONE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
sourceTableSize |
Die Größe in Byte der Quelltabelle in der Version, die geklont wird. |
sourceNumOfFiles |
Die Anzahl der Dateien in der Quelltabelle in der Version, die geklont wird. |
numRemovedFiles |
Die Anzahl der Dateien, die aus der Zieltabelle entfernt wurden, wenn eine vorherige Tabelle ersetzt wurde. |
removedFilesSize |
Die Gesamtgröße in Byte der Dateien, die aus der Zieltabelle entfernt wurden, wenn eine vorherige Tabelle ersetzt wurde. |
numCopiedFiles |
Die Anzahl der Dateien, die an den neuen Speicherort kopiert wurden. „0“ für flache Klone. |
copiedFilesSize |
Die Gesamtgröße in Byte der Dateien, die an den neuen Speicherort kopiert wurden. „0“ für flache Klone. |
RESTORE
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
tableSizeAfterRestore |
Die Tabellengröße in Byte nach der Wiederherstellung. |
numOfFilesAfterRestore |
Die Anzahl der Dateien in der Tabelle nach der Wiederherstellung. |
numRemovedFiles |
Die Anzahl der Dateien, die vom Wiederherstellungsvorgang entfernt wurden. |
numRestoredFiles |
Die Anzahl der Dateien, die als Ergebnis der Wiederherstellung hinzugefügt wurden. |
removedFilesSize |
Die Größe in Bytes von Dateien, die von der Wiederherstellung entfernt wurden. |
restoredFilesSize |
Die Größe in Bytes von Dateien, die durch die Wiederherstellung hinzugefügt wurden. |
VACUUM
Die folgenden Metriken sind für diesen Vorgang verfügbar:
| Metrikname | Beschreibung |
|---|---|
numDeletedFiles |
Die Anzahl der gelöschten Dateien. |
numVacuumedDirectories |
Die Anzahl von bereinigten Verzeichnissen. |
numFilesToDelete |
Die Anzahl der zu löschenden Dateien. |
Zeitreise
Die Zeitreise unterstützt das Abfragen früherer Tabellenversionen basierend auf der Zeitstempel- oder Tabellenversion (wie im Transaktionsprotokoll aufgezeichnet). Sie können Zeitreisen für Anwendungen wie die folgenden verwenden:
- Erneutes Erstellen von Analysen, Berichten oder Ausgaben, z. B. der Ausgabe eines Modells für maschinelles Lernen. Dies kann für das Debuggen oder die Überwachung nützlich sein, insbesondere in regulierten Branchen.
- Schreiben komplexer temporaler Abfragen.
- Beheben von Fehlern in Ihren Daten.
- Gewährleistung von Schnappschussisolation für mehrere Abfragen bei sich schnell ändernden Tabellen.
Note
In Databricks Runtime 18.0 und höher werden Zeitreiseabfragen blockiert, wenn sie eine Version anfordern, die älter als die deletedFileRetentionDuration Tabelleneigenschaft ist (Standard 7 Tage). Bei verwalteten Tabellen im Unity-Katalog gilt dies für Databricks Runtime 12.2 und höher.
Zeitreisesyntax
Sie fragen eine Tabelle mit Zeitreise ab, indem Sie eine Klausel nach der Tabellennamenspezifikation hinzufügen.
-
timestamp_expressionkann einen der folgenden Werte annehmen:-
'2018-10-18T22:15:12.013Z', d. h. eine Zeichenfolge, die zu einem Zeitstempel konvertiert werden kann cast('2018-10-18 13:36:32 CEST' as timestamp)-
'2018-10-18', d. h. eine Datumszeichenfolge current_timestamp() - interval 12 hoursdate_sub(current_date(), 1)- Jeder andere Ausdruck, der ein Zeitstempel ist oder in einen Zeitstempel umgewandelt werden kann
-
-
versionist ein langer Wert, der sich aus der Ausgabe vonDESCRIBE HISTORY table_spec.
Weder timestamp_expression noch version können Unterabfragen sein.
Es werden nur Datums- oder Zeitstempelzeichenfolgen akzeptiert. Beispiel: "2019-01-01" und "2019-01-01T00:00:00.000Z". Eine Beispielsyntax finden Sie im folgenden Code:
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")
Sie können auch die Syntax @ verwenden, um den Zeitstempel oder die Version als Teil des Tabellennamens anzugeben. Der Zeitstempel muss im Format yyyyMMddHHmmssSSS vorliegen. Sie können eine Version mit @v. Eine Beispielsyntax finden Sie im folgenden Code:
SQL
-- Timestamp version
SELECT * FROM people10m@20190101000000000
-- Version number
SELECT * FROM people10m@v123
Python
# Timestamp version
spark.read.table("people10m@20190101000000000")
# Version number
spark.read.table("people10m@v123")
Konfigurieren der Datenaufbewahrung für Zeitreiseabfragen
Um eine frühere Tabellenversion abzufragen, müssen Sie sowohl das Protokoll als auch die Datendateien für diese Version beibehalten:
- Datendateien werden gelöscht, wenn
VACUUMgegen eine Tabelle ausgeführt wird. - Protokolldateien werden nach dem Überprüfen der Tabellenversionen automatisch entfernt.
Um den Schwellenwert für die Datenaufbewahrung für Tabellen zu erhöhen, müssen Sie die folgenden Tabelleneigenschaften konfigurieren, wobei <format> durch delta oder iceberg ersetzt wird:
-
<format>.logRetentionDuration = "interval <interval>": Steuert, wie lange der Verlauf einer Tabelle aufbewahrt wird. Der Standardwert lautetinterval 30 days.- In Databricks Runtime 18.0 und höher muss
logRetentionDurationgrößer oder gleichdeletedFileRetentionDurationsein. Bei verwalteten Tabellen im Unity-Katalog gilt dies für Databricks Runtime 12.2 und höher.
- In Databricks Runtime 18.0 und höher muss
-
<format>.deletedFileRetentionDuration = "interval <interval>": bestimmt den Schwellenwert, denVACUUMverwendet, um Datendateien zu entfernen, auf die in der aktuellen Tabellenversion nicht mehr verwiesen wird. Der Standardwert lautetinterval 7 days.
Wenn Sie z. B. auf 30 Tage verlaufsgeschichtliche Daten zugreifen möchten, legen Sie diese fest delta.deletedFileRetentionDuration = "interval 30 days", die der Standardeinstellung entspricht delta.logRetentionDuration.
Important
Die Erhöhung des Schwellenwerts für die Datenaufbewahrung kann dazu führen, dass Ihre Speicherkosten steigen, da mehr Datendateien aufbewahrt werden.
Sie können Tabelleneigenschaften während der Tabellenerstellung angeben oder mit einer ALTER TABLE Anweisung festlegen. Siehe Referenz zu Tabelleneigenschaften.
Beispiele für Zeitreisen
So beheben Sie versehentliche Löschungen in einer Tabelle für den Benutzer 111:
INSERT INTO my_table
SELECT * FROM my_table TIMESTAMP AS OF date_sub(current_date(), 1)
WHERE userId = 111
So beheben Sie versehentlich falsche Updates für eine Tabelle:
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 *
So fragen Sie die Anzahl der neuen Kunden ab, die in der letzten Woche hinzugefügt wurden:
SELECT
(
SELECT count(distinct userId)
FROM my_table
)
-
(
SELECT count(distinct userId)
FROM my_table TIMESTAMP AS OF date_sub(current_date(), 7)
) AS new_customers
Transaktionsprotokollprüfpunkte
Das Transaktionsprotokoll zeichnet Tabellenversionen als JSON-Dateien im Transaktionsprotokollverzeichnis zusammen mit Tabellendaten auf.
Um das Abfragen von Checkpoints zu optimieren, werden Tabellenversionen in Parquet-Checkpoint-Dateien zusammengefasst, was die Leistung verbessert, da so nicht alle JSON-Versionen der Tabellenhistorie gelesen werden müssen. Benutzer müssen nicht direkt mit Prüfpunkten interagieren.
Azure Databricks optimiert die Prüfpunkthäufigkeit für Datengröße und Workload. Die Prüfpunkthäufigkeit kann sich ohne Ankündigung ändern.
Wiederherstellen einer Tabelle in einem früheren Zustand
Verwenden Sie den RESTORE Befehl, um eine Tabelle auf eine frühere Version oder einen Zeitstempel wiederherzustellen, einschließlich für diese Szenarien:
- Sie können eine Tabelle, die bereits wiederhergestellt wurde, erneut wiederherstellen.
- Sie können eine geklonte Tabelle wiederherstellen.
Berücksichtigen Sie die folgenden Anforderungen:
- Um eine Tabelle wiederherzustellen, müssen Sie über die Berechtigung für die Tabelle verfügen
MODIFY. - Nachdem Datendateien manuell oder durch
VACUUMgelöscht wurden, können Sie eine Tabelle nicht auf eine ältere Version zurücksetzen, die auf diese Dateien verweist. Die teilweise Wiederherstellung auf diese Version ist weiterhin möglich, wennspark.sql.files.ignoreMissingFilesauftruefestgelegt wird. - Verwenden Sie zum Wiederherstellen nach Zeitstempel die Formate
yyyy-MM-dd HH:mm:ssoderyyyy-MM-dd.
RESTORE TABLE target_table TO VERSION AS OF <version>;
RESTORE TABLE target_table TO TIMESTAMP AS OF <timestamp>;
Ausführliche Informationen zur Syntax finden Sie unter RESTORE.
Streamingverhalten
Die Wiederherstellung ist ein datenverändernder Vorgang und kann zu doppelten Daten für nachgeschaltete Workloads führen. Vom Befehl hinzugefügte RESTORE Protokolleinträge enthalten "dataChange", das auf "true" gesetzt ist.
Bei nachgelagerten Workloads, z. B. einem strukturierten Streamingauftrag , der die Aktualisierungen an einer Tabelle verarbeitet, werden die vom Wiederherstellungsvorgang hinzugefügten Datenänderungsprotokolleinträge als neue Datenaktualisierungen betrachtet, und die Verarbeitung kann zu doppelten Daten führen.
Beispiel:
| Tabellenversion | Operation | Protokollaktualisierungen | Datensätze in Protokollaktualisierungen zu Datenänderungen |
|---|---|---|---|
| 0 | INSERT |
AddFile(/path/to/file-1, dataChange = true) |
(Name = Viktor, Alter = 29), (Name = George, Alter = 55) |
| 1 | INSERT |
AddFile(/path/to/file-2, dataChange = true) |
(Name = George, Alter = 39) |
| 2 | OPTIMIZE |
AddFile(/path/to/file-3, dataChange = false), RemoveFile(/path/to/file-1), RemoveFile(/path/to/file-2) |
Keine Datensätze.
OPTIMIZE Die Komprimierung ändert die Daten in der Tabelle nicht. |
| 3 | RESTORE(version=1) |
RemoveFile(/path/to/file-3), AddFile(/path/to/file-1, dataChange = true), AddFile(/path/to/file-2, dataChange = true) |
(Name = Viktor, Alter = 29), (Name = George, Alter = 55), (Name = George, Alter = 39) |
Im vorherigen Beispiel führt der RESTORE Befehl zu Updates, die beim Lesen der Tabellenversion 0 und 1 zuvor angezeigt wurden. Wenn eine Streamingabfrage diese Tabelle erneut liest, werden diese Dateien als neu hinzugefügte Daten betrachtet und erneut verarbeitet.
Wiederherstellen von Metriken
Nach Abschluss meldet RESTORE die folgenden Metriken als einzeiligen DataFrame:
table_size_after_restore: Die Größe der Tabelle nach der Wiederherstellung.num_of_files_after_restoreDie Anzahl von Dateien in der Tabelle nach der Wiederherstellung.num_removed_files: Die Anzahl von Dateien, die aus der Tabelle entfernt (logisch gelöscht) wurden.num_restored_files: Die Anzahl von Dateien, die aufgrund eines Rollbacks wiederhergestellt wurden.removed_files_size: Die Gesamtgröße in Bytes der aus der Tabelle entfernten Dateien.restored_files_size: Die Gesamtgröße in Bytes der wiederhergestellten Dateien.
Letzte Commit-Version suchen
Um die Versionsnummer des letzten Commits zu erhalten, der von der aktuellen SparkSession für alle Threads und alle Tabellen geschrieben wurde, fragen Sie die SQL-Konfiguration spark.databricks.<format>.lastCommitVersionInSession ab. Ersetzen Sie <format> je nach Tabellenformat durch delta oder iceberg.
Beispiel:
SQL
SET spark.databricks.delta.lastCommitVersionInSession
Python
spark.conf.get("spark.databricks.delta.lastCommitVersionInSession")
Scala
spark.conf.get("spark.databricks.delta.lastCommitVersionInSession")
Wenn von der SparkSession keine Commits durchgeführt wurden, wird beim Abfragen des Schlüssels ein leerer Wert zurückgegeben.
Note
Wenn Sie dasselbe SparkSession für mehrere Threads freigeben, ähnelt es der Freigabe einer Variablen über mehrere Threads hinweg. Möglicherweise treten Racebedingungen für gleichzeitige Aktualisierungen des Konfigurationswerts auf.