Arbeiten mit Tabellenverlauf

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

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_expression kann 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 hours
    • date_sub(current_date(), 1)
    • Jeder andere Ausdruck, der ein Zeitstempel ist oder in einen Zeitstempel umgewandelt werden kann
  • version ist ein langer Wert, der sich aus der Ausgabe von DESCRIBE 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 VACUUM gegen 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 lautet interval 30 days.
    • In Databricks Runtime 18.0 und höher muss logRetentionDuration größer oder gleich deletedFileRetentionDuration sein. Bei verwalteten Tabellen im Unity-Katalog gilt dies für Databricks Runtime 12.2 und höher.
  • <format>.deletedFileRetentionDuration = "interval <interval>": bestimmt den Schwellenwert, den VACUUM verwendet, um Datendateien zu entfernen, auf die in der aktuellen Tabellenversion nicht mehr verwiesen wird. Der Standardwert lautet interval 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 VACUUM gelö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, wenn spark.sql.files.ignoreMissingFiles auf true festgelegt wird.
  • Verwenden Sie zum Wiederherstellen nach Zeitstempel die Formate yyyy-MM-dd HH:mm:ss oder yyyy-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_restore Die 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.

    Beispiel der Wiederherstellung von Metriken

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.