Remarque
L’accès à cette page requiert une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page requiert une autorisation. Vous pouvez essayer de modifier des répertoires.
Pour les tables Apache Iceberg et Delta Lake, chaque opération qui modifie une table crée une nouvelle version de table. Utilisez les informations d’historique pour auditer les opérations, restaurer une table ou interroger une table à un point précis dans le temps en utilisant le voyage dans le temps.
Note
Databricks ne recommande pas d’utiliser l’historique des tables comme solution de sauvegarde à long terme pour l’archivage des données. Utilisez uniquement les 7 derniers jours pour des opérations de voyage dans le temps, sauf si vous avez défini des configurations de conservation des données et des journaux sur une valeur supérieure.
Récupérer l’historique des tables
Exécutez la DESCRIBE HISTORY commande pour récupérer des informations, notamment les opérations, l’utilisateur et l’horodatage pour chaque écriture dans une table. Les opérations sont retournées dans l’ordre chronologique inverse.
La rétention de l’historique des tables est déterminée par le paramètre de table logRetentionDuration, qui est de 30 jours par défaut.
Note
Le voyage dans le temps et l’historique des tables sont contrôlés par des seuils de rétention distincts. Voir voyage dans le temps.
DESCRIBE HISTORY table_name -- get the full history of the table
DESCRIBE HISTORY table_name LIMIT 1 -- get the last operation only
Pour plus d’informations sur la syntaxe Spark SQL, consultez DESCRIBE HISTORY.
Pour plus d’informations sur la syntaxe Scala, Java et Python, consultez la documentation de l’API Delta Lake.
L’Explorateur de catalogue affiche visuellement l’historique des tables sous l’onglet Historique .
Schéma de l’historique
La sortie de l'opération history contient les colonnes suivantes.
| Column | Type | Description |
|---|---|---|
| version | long |
Version de table générée par l’opération. |
| timestamp | timestamp |
Moment de validation de cette version. |
| identifiant utilisateur | string |
ID de l’utilisateur qui a exécuté l’opération. |
| userName | string |
Nom de l’utilisateur qui a exécuté l’opération. |
| fonctionnement | string |
Nom de l’opération. |
| paramètres d'opération | map |
Paramètres de l’opération (par exemple, prédicats.) Pour OPTIMIZE les opérations, ces paramètres identifient le type d’opération. Consultez Identifier le type d’opérationOPTIMIZE. |
| tâche | struct |
Détails du travail Lakeflow qui a effectué l’opération. Remplit uniquement les validations écrites à partir d’un travail Lakeflow. Sinon, null. |
| notebook | struct |
Détails du notebook Databricks depuis lequel l’opération a été exécutée. Remplit uniquement les validations écrites à partir d’un notebook Databricks. Sinon, null. |
| clusterId | string |
ID du cluster sur lequel l’opération s’est exécutée. |
| readVersion | long |
Version de la table qui a été lue pour effectuer l’opération d’écriture. |
| isolationLevel | string |
Niveau d’isolation utilisé pour cette opération. |
| isBlindAppend | boolean |
Indique si cette opération a ajouté des données. |
| operationMetrics | map |
Métriques de l’opération (par exemple, nombre de lignes et de fichiers modifiés.) |
| UserMetadata | string |
Les métadonnées de commit définies par l’utilisateur, si elles ont été spécifiées. |
+-------+-------------------+------+--------+---------+--------------------+----+--------+---------+-----------+-----------------+-------------+--------------------+
|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
- Si vous écrivez dans une table à l’aide des méthodes suivantes, certaines colonnes ne sont pas disponibles :
- Les colonnes ajoutées à l’avenir seront toujours ajoutées après la dernière colonne.
Présentation des partitionBy paramètres d’opération
Le partitionBy champ de l’historique des tables n’est significatif que pour les opérations CREATE et OVERWRITE qui définissent ou modifient le schéma de partition d’une table.
Pour les opérations d’ajout à des tables existantes (APPEND, INSERT, DELETE UPDATE, MERGE), ce champ peut afficher un tableau [] ou des colonnes de partition vides en fonction de la méthode d’écriture utilisée (.save() vs .saveAsTable()).
Cette incohérence est attendue et n’affecte pas la façon dont les données sont écrites dans des partitions. Vous ne devez pas l’utiliser pour valider les opérations d’ajout.
Example
Considérez une table partitionnée par la date colonne. Lorsque vous créez la table, partitionBy est renseignée :
df.write.format("delta") \
.partitionBy("date") \
.saveAsTable("sales_data")
L’opération CREATE dans l’historique affiche :
operationParameters: {
"mode": "ErrorIfExists",
"partitionBy": "[\"date\"]"
}
Lorsque vous ajoutez des données à cette table, partitionBy affiche un tableau vide :
new_df.write.format("delta") \
.mode("append") \
.saveAsTable("sales_data")
L’opération APPEND affiche :
operationParameters: {
"mode": "Append",
"partitionBy": "[]"
}
La valeur vide partitionBy est attendue. Les données sont toujours écrites dans les partitions correctes en fonction du schéma de partition existant de la table. Notez que la référence .save() à un chemin d’accès peut afficher des colonnes de partition dans ce champ, mais cette différence est un détail d’implémentation et n’affecte pas le comportement d’écriture.
Métriques d’opération
L’opération history retourne une collection de métriques d’opération dans le mappage de colonnes operationMetrics.
Les tableaux suivants répertorient les définitions de clé de mappage par opération.
WRITE, CREATE TABLE AS SELECT, REPLACE TABLE AS SELECT, COPY INTO
Les métriques suivantes sont disponibles pour ces opérations :
| Nom de la métrique | Description |
|---|---|
numFiles |
Nombre de fichiers écrits. |
numOutputBytes |
Taille en octets du contenu écrit. |
numOutputRows |
Nombre de lignes écrites. |
STREAMING UPDATE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numAddedFiles |
Nombre de fichiers ajoutés. |
numRemovedFiles |
Nombre de fichiers supprimés. |
numOutputRows |
Nombre de lignes écrites. |
numOutputBytes |
La taille de l’écriture en octets. |
DELETE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numAddedFiles |
Nombre de fichiers ajoutés. Non fourni lors de la suppression des partitions de la table. |
numRemovedFiles |
Nombre de fichiers supprimés. |
numDeletedRows |
Nombre de lignes supprimées. Non fourni lors de la suppression des partitions de la table. |
numCopiedRows |
Nombre de lignes copiées dans le processus de suppression de fichiers. |
executionTimeMs |
Temps nécessaire pour exécuter l’ensemble de l’opération. |
scanTimeMs |
Le temps nécessaire pour analyser les fichiers afin de trouver des correspondances. |
rewriteTimeMs |
Temps nécessaire pour réécrire les fichiers correspondants. |
TRUNCATE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numRemovedFiles |
Nombre de fichiers supprimés. |
executionTimeMs |
Temps nécessaire pour exécuter l’ensemble de l’opération. |
MERGE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numSourceRows |
Nombre de lignes dans le DataFrame source. |
numTargetRowsInserted |
Nombre de lignes insérées dans la table cible. |
numTargetRowsUpdated |
Nombre de lignes mises à jour dans la table cible. |
numTargetRowsDeleted |
Nombre de lignes supprimées dans la table cible. |
numTargetRowsCopied |
Nombre de lignes cibles copiées. |
numOutputRows |
Nombre total de lignes écrites. |
numTargetFilesAdded |
Le nombre de fichiers ajoutés au récepteur (cible). |
numTargetFilesRemoved |
Nombre de fichiers supprimés du récepteur (cible). |
executionTimeMs |
Temps nécessaire pour exécuter l’ensemble de l’opération. |
scanTimeMs |
Le temps nécessaire pour analyser les fichiers afin de trouver des correspondances. |
rewriteTimeMs |
Temps nécessaire pour réécrire les fichiers correspondants. |
UPDATE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numAddedFiles |
Nombre de fichiers ajoutés. |
numRemovedFiles |
Nombre de fichiers supprimés. |
numUpdatedRows |
Nombre de lignes mises à jour. |
numCopiedRows |
Nombre de lignes copiées dans le processus de mise à jour des fichiers. |
executionTimeMs |
Temps nécessaire pour exécuter l’ensemble de l’opération. |
scanTimeMs |
Le temps nécessaire pour analyser les fichiers afin de trouver des correspondances. |
rewriteTimeMs |
Temps nécessaire pour réécrire les fichiers correspondants. |
FSCK
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numRemovedFiles |
Nombre de fichiers supprimés. |
CONVERT
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numConvertedFiles |
Nombre de fichiers Parquet qui ont été convertis. |
OPTIMIZE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numAddedFiles |
Nombre de fichiers ajoutés. |
numRemovedFiles |
Nombre de fichiers optimisés. |
numAddedBytes |
Nombre d’octets ajoutés après l’optimisation de la table. |
numRemovedBytes |
Nombre d’octets supprimés. |
minFileSize |
Taille du fichier le plus petit après l’optimisation de la table. |
p25FileSize |
La taille du fichier du 25e percentile après l’optimisation du tableau. |
p50FileSize |
Taille médiane du fichier après l’optimisation de la table. |
p75FileSize |
Taille du fichier du 75e percentile après l’optimisation de la table. |
maxFileSize |
Taille du plus grand fichier après l’optimisation de la table. |
CLONE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
sourceTableSize |
Taille en octets de la table source dans la version clonée. |
sourceNumOfFiles |
Le nombre de fichiers dans la table source dans la version qui est clonée. |
numRemovedFiles |
Nombre de fichiers supprimés de la table cible si une table précédente a été remplacée. |
removedFilesSize |
Taille totale en octets des fichiers supprimés de la table cible si une table précédente a été remplacée. |
numCopiedFiles |
Nombre de fichiers copiés vers le nouvel emplacement. 0 pour les clones superficiels. |
copiedFilesSize |
Taille totale en octets des fichiers copiés vers le nouvel emplacement. 0 pour les clones superficiels. |
RESTORE
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
tableSizeAfterRestore |
La taille de la table en octets après restauration. |
numOfFilesAfterRestore |
Nombre de fichiers dans la table après la restauration. |
numRemovedFiles |
Nombre de fichiers supprimés par l’opération de restauration. |
numRestoredFiles |
Nombre de fichiers ajoutés à la suite de la restauration. |
removedFilesSize |
Taille en octets des fichiers supprimés par la restauration. |
restoredFilesSize |
Taille en octets des fichiers ajoutés par la restauration. |
VACUUM
Les métriques suivantes sont disponibles pour cette opération :
| Nom de la métrique | Description |
|---|---|
numDeletedFiles |
Nombre de fichiers supprimés. |
numVacuumedDirectories |
Le nombre de répertoires vidés. |
numFilesToDelete |
Nombre de fichiers à supprimer. |
Identifier le type d’opération OPTIMIZE
Le compactage automatique, le clustering liquide et l’ordre Z apparaissent tous dans l’historique des tables en tant qu’opérations OPTIMIZE . Pour déterminer lequel a été exécuté, inspectez la colonne operationParameters.
Pour classifier chaque OPTIMIZE opération dans l’historique d’une table, exécutez ce qui suit :
SELECT
version,
timestamp,
CASE
WHEN operationParameters.clusterBy IS NOT NULL AND operationParameters.clusterBy <> '[]' THEN 'Liquid clustering'
WHEN operationParameters.zOrderBy IS NOT NULL AND operationParameters.zOrderBy <> '[]' THEN 'Z-ordering'
WHEN operationParameters.auto = 'true' THEN 'Auto compaction'
ELSE 'Manual OPTIMIZE'
END AS optimize_type,
operationParameters.auto AS is_auto_compaction,
operationParameters.clusterBy AS cluster_by,
operationParameters.zOrderBy AS z_order_by,
operationMetrics.numRemovedFiles AS files_compacted,
operationMetrics.numAddedFiles AS files_added,
operationMetrics.numRemovedBytes AS bytes_removed,
operationMetrics.numAddedBytes AS bytes_added
FROM (DESCRIBE HISTORY table_name)
WHERE operation = 'OPTIMIZE'
ORDER BY version DESC;
Les sections suivantes décrivent chaque operationParameters valeur en détail.
Compactage automatique
Le compactage automatique définit le auto paramètre sur true. Azure Databricks déclenche automatiquement le compactage automatique après une écriture. Lorsque auto est false, un utilisateur ou une tâche planifiée a exécuté la commande OPTIMIZE.
Par exemple, une opération de compactage automatique affiche les éléments suivants :
operationParameters: {
"auto": "true"
}
Pour plus d’informations sur le compactage automatique, consultez Compactage automatique.
Regroupement de liquide
Le clustering liquid renseigne le paramètre clusterBy avec les noms des colonnes de clustering. Un tableau vide clusterBy ([]) indique uniquement le compactage de fichiers.
Par exemple, une opération qui a regroupé les données par les colonnes date et region affiche ce qui suit :
operationParameters: {
"clusterBy": "[\"date\",\"region\"]"
}
Pour plus d’informations sur le clustering liquide, consultez Utiliser le clustering liquide pour les tables.
Classement Z
Le tri Z remplit le paramètre zOrderBy avec les noms des colonnes du tri Z. Un tableau vide zOrderBy ([]) indique que l’opération n’a pas appliqué l’ordre Z.
Par exemple, une opération qui a appliqué l’ordre Z sur la date colonne affiche les éléments suivants :
operationParameters: {
"zOrderBy": "[\"date\"]"
}
Étendue opération
Le predicate paramètre indique si l’opération s’est exécutée sur la table complète ou uniquement une partie de celle-ci :
- Un tableau vide
predicate([]) signifie que l’opération s’est exécutée sur l’ensemble de la table. - Un tableau rempli
predicatesignifie qu’une commande cibléeOPTIMIZE table_name WHERE <partition_predicate>s’exécute uniquement sur les partitions qui correspondent au prédicat.
Par exemple, une opération ciblée sur les partitions correspondantes year = 2024 affiche les éléments suivants :
operationParameters: {
"predicate": "[\"'year = 2024\"]"
}
Voyage dans le temps
Le voyage dans le temps permet d’interroger des versions précédentes d’une table en se basant sur l’horodatage ou sur la version de table (telle qu’enregistrée dans le journal des transactions). Vous pouvez utiliser le voyage dans le temps pour des applications telles que celles qui suivent :
- Recréation d’analyses, de rapports ou de sorties, telles que la sortie d’un modèle Machine Learning. Cela peut être utile pour le débogage ou l’audit, en particulier dans les secteurs réglementés.
- Écriture de requêtes temporelles complexes.
- Correction des erreurs dans vos données.
- Fournir un instantané d’isolation pour un ensemble de requêtes des tables à variation rapide.
Note
Dans Databricks Runtime 18.0 et versions ultérieures, les requêtes de déplacement du temps sont bloquées si elles demandent une version antérieure à la deletedFileRetentionDuration propriété de table (par défaut 7 jours). Pour les tables managées du catalogue Unity, cela s’applique à Databricks Runtime 12.2 et versions ultérieures.
Syntaxe de voyage dans le temps
Vous interrogez une table avec le voyage temporel en ajoutant une clause après la spécification du nom de la table.
-
timestamp_expressionpeut être n’importe quel :-
'2018-10-18T22:15:12.013Z', autrement dit, une chaîne qui peut être convertie en timestamp cast('2018-10-18 13:36:32 CEST' as timestamp)-
'2018-10-18', autrement dit, une chaîne de date current_timestamp() - interval 12 hoursdate_sub(current_date(), 1)- Toute autre expression qui est ou qui peut être convertie en un timestamp
-
-
versionest une valeur de type long qui peut être obtenue à partir de la sortie deDESCRIBE HISTORY table_spec.
Ni timestamp_expression ni version ne peuvent être des sous-requêtes.
Seules les chaînes de date ou timestamp sont acceptées. Par exemple : "2019-01-01" et "2019-01-01T00:00:00.000Z". Pour obtenir un exemple de syntaxe, consultez le code suivant :
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")
Vous pouvez également utiliser la syntaxe @ pour spécifier le timestamp ou la version dans le cadre du nom de la table. Le timestamp doit être au format yyyyMMddHHmmssSSS. Vous pouvez spécifier une version avec @v. Pour obtenir un exemple de syntaxe, consultez le code suivant :
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")
Configurer la conservation des données pour des requêtes de voyage dans le temps
Pour interroger une version de table précédente, vous devez conserver le journal et les fichiers de données pour cette version :
- Les fichiers de données sont supprimés lorsque
VACUUMs’exécute sur une table. - Les fichiers journaux sont supprimés automatiquement après les points de contrôle des versions de table.
Pour augmenter le seuil de rétention des données des tables, vous devez configurer les propriétés de la table suivantes, en remplaçant <format> par delta ou iceberg :
-
<format>.logRetentionDuration = "interval <interval>": contrôle la durée de conservation de l’historique d’une table. La valeur par défaut estinterval 30 days.- Dans Databricks Runtime 18.0 et versions ultérieures,
logRetentionDurationdoit être supérieur ou égal àdeletedFileRetentionDuration. Pour les tables managées du catalogue Unity, cela s’applique à Databricks Runtime 12.2 et versions ultérieures.
- Dans Databricks Runtime 18.0 et versions ultérieures,
-
<format>.deletedFileRetentionDuration = "interval <interval>": détermine le seuil queVACUUMutilise pour supprimer des fichiers de données qui ne sont plus référencés dans la version actuelle de la table. La valeur par défaut estinterval 7 days.
Par exemple, pour accéder à 30 jours de données historiques, définir delta.deletedFileRetentionDuration = "interval 30 days", qui correspond au paramètre par défaut pour delta.logRetentionDuration.
Important
L’augmentation du seuil de conservation des données peut entraîner une augmentation de vos coûts de stockage, à mesure que d’autres fichiers de données sont gérés.
Vous pouvez spécifier des propriétés de table lors de la création de la table ou les définir avec une ALTER TABLE instruction. Consultez les informations de référence sur les propriétés de la table.
Exemples de voyages temporels
Pour corriger des suppressions accidentelles dans une table pour l’utilisateur 111 :
INSERT INTO my_table
SELECT * FROM my_table TIMESTAMP AS OF date_sub(current_date(), 1)
WHERE userId = 111
Pour corriger les mises à jour incorrectes accidentelles d’une table :
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 *
Pour interroger le nombre de nouveaux clients ajoutés au cours de la semaine dernière :
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
Points de contrôle du journal des transactions
Le journal des transactions enregistre les versions de table sous forme de fichiers JSON dans le répertoire du journal des transactions, ainsi que les données de table.
Pour optimiser l’interrogation de points de contrôle, les versions de table sont agrégées aux fichiers de point de contrôle Parquet, ce qui améliore les performances en empêchant la lecture de toutes les versions JSON de l’historique des tables. Les utilisateurs n’ont pas besoin d’interagir directement avec les points de contrôle.
Azure Databricks optimise la fréquence des points de contrôle pour la taille des données et la charge de travail. La fréquence du point de contrôle est susceptible d’être modifiée sans préavis.
Restaurer une table à un état antérieur
Utilisez la RESTORE commande pour restaurer une table vers une version ou un horodatage précédent, notamment pour les scénarios suivants :
- Vous pouvez restaurer une table déjà restaurée.
- Vous pouvez restaurer une table clonée.
Tenez compte des exigences suivantes :
- Pour restaurer une table, vous devez disposer droits
MODIFYpour la table. - Une fois les fichiers de données supprimés, manuellement ou par
VACUUM, vous ne pouvez pas restaurer une table à une version antérieure qui fait référence à ces fichiers. Une restauration partielle vers cette version reste possible sispark.sql.files.ignoreMissingFilesa la valeurtrue. - Pour restaurer par horodatage, utilisez les formats
yyyy-MM-dd HH:mm:ssouyyyy-MM-dd.
RESTORE TABLE target_table TO VERSION AS OF <version>;
RESTORE TABLE target_table TO TIMESTAMP AS OF <timestamp>;
Pour plus d’informations sur la syntaxe, consultez RESTORE.
Comportement de diffusion en continu
La restauration est une opération de modification des données et peut entraîner des données en double pour les charges de travail en aval. Les entrées de journal ajoutées par la commande RESTORE contiennent dataChange défini sur true.
Pour les charges de travail en aval, telles qu’un travail de streaming structuré qui traite les mises à jour d’une table, les entrées du journal des modifications de données ajoutées par l’opération de restauration sont considérées comme de nouvelles mises à jour de données et le traitement des données peut entraîner des données en double.
Par exemple:
| Version de la table | Operation | Mises à jour du journal des événements | Enregistrements dans les mises à jour du journal des modifications de données |
|---|---|---|---|
| 0 | INSERT |
AddFile(/path/to/file-1, dataChange = true) |
(nom = Viktor, âge = 29), (nom = George, âge = 55) |
| 1 | INSERT |
AddFile(/path/to/file-2, dataChange = true) |
(name = George, age = 39) |
| 2 | OPTIMIZE |
AddFile(/path/to/file-3, dataChange = false), RemoveFile(/path/to/file-1), RemoveFile(/path/to/file-2) |
Aucun enregistrement.
OPTIMIZE compactage ne modifie pas les données de la table. |
| 3 | RESTORE(version=1) |
RemoveFile(/path/to/file-3), AddFile(/path/to/file-1, dataChange = true), AddFile(/path/to/file-2, dataChange = true) |
(nom = Viktor, âge = 29), (nom = George, âge = 55), (nom = George, âge = 39) |
Dans l’exemple précédent, la RESTORE commande génère des mises à jour qui ont été vues précédemment lors de la lecture de la table version 0 et 1. Si une requête de diffusion en continu lit à nouveau cette table, ces fichiers sont considérés comme des données nouvellement ajoutées et sont à nouveau traités.
Restaurer des métriques
Une fois terminé, RESTORE signale les métriques suivantes sous la forme d’un DataFrame de ligne unique :
table_size_after_restore: taille de la table après restauration.num_of_files_after_restore: nombre de fichiers dans la table après restauration.num_removed_files: nombre de fichiers supprimés (logiquement) de la table.num_restored_files: nombre de fichiers restaurés en raison d'un retour en arrière.removed_files_size: taille totale en octets des fichiers supprimés de la table.restored_files_size: taille totale en octets des fichiers restaurés.
Trouver la version du dernier commit
Pour obtenir le numéro de version de la dernière validation écrite par la SparkSession en cours sur l’ensemble des threads et des tables, interrogez la configuration SQL spark.databricks.<format>.lastCommitVersionInSession. Remplacez <format> par l’un delta ou l’autre, icebergselon le format de votre tableau.
Par exemple:
SQL
SET spark.databricks.delta.lastCommitVersionInSession
Python
spark.conf.get("spark.databricks.delta.lastCommitVersionInSession")
Scala
spark.conf.get("spark.databricks.delta.lastCommitVersionInSession")
Si aucune action de validation n’a été effectuée par SparkSession, l’interrogation de la clé retourne une valeur vide.
Note
Si vous partagez le même SparkSession entre plusieurs threads, cela revient à partager une variable entre plusieurs threads. Vous pouvez rencontrer des conditions de concurrence pour les mises à jour simultanées de la valeur de configuration.