Entwerfen und Implementieren einer zeitlichen (Verlaufstabelle) zum Aufzeichnen von Änderungen im Laufe der Zeit

Abgeschlossen

Datenpipelinen erfordern häufig die Nachverfolgung nicht nur aktueller Werte, sondern jede Änderung, die im Laufe der Zeit auftritt. Zeitliche Tabellen stellen einen Mechanismus zum automatischen Aufzeichnen von Änderungen auf Zeilenebene bereit, wodurch Punkt-in-Time-Abfragen und vollständige Überwachungspfade aktiviert werden. Im Gegensatz zu langsam wechselnden Dimensionen, die sich auf den Geschäftsdatenverlauf konzentrieren, erfassen zeitliche Tabellen den technischen Verlauf für die Betriebsablaufverfolgung und das Debuggen.

Vergleich zwischen temporalen Tabellen und SCD Type 2

Zeitliche Tabellen und SCD Type 2-Dimensionen dienen unterschiedlichen Zwecken, obwohl beide historische Änderungen nachverfolgen. Wenn Sie wissen, wann Sie jeden Ansatz verwenden, können Sie geeignete Lösungen entwerfen.

SCD Typ 2 verfolgt Änderungen an Geschäftsentitäten im Laufe der Zeit für analytische Berichte nach. Wenn ein Kunde von Seattle nach Portland wechselt, möchten Sie historische Verkäufe zum Zeitpunkt jeder Transaktion dem Standort des Kunden zuordnen. SCD Typ 2 verwaltet geschäftsrelevante Versionen mit expliziten Anfangs- und Enddaten.

Zeitliche (Verlaufstabellen) erfassen technische Änderungen für betriebliche Anforderungen. Bei der Problembehandlung, warum Daten falsch geladen wurden, müssen Sie genau sehen, welche Werte zu jedem Zeitpunkt vorhanden waren, welche Dateien verarbeitet wurden und wann Änderungen vorgenommen wurden. Zeitliche Tabellen stellen diese forensische Funktion automatisch bereit.

Diagramm, das zeitliche Tabellen im Vergleich zu SCD-Typ 2 erläutert.

Erwägen Sie die Verwendung zeitlicher Tabellen, wenn Sie Folgendes benötigen:

  • Debuggen von Datenaufnahmeproblemen durch Untersuchen des Tabellenzustands zu bestimmten Zeitstempeln
  • Alle Änderungen an Compliance- oder behördlichen Anforderungen überwachen
  • Reproduzieren von Analysen oder Berichten aus einem bestimmten Zeitpunkt
  • Nachverfolgen von Betriebsmetadaten wie Ladezeiten und Quelldateiinformationen

Aktivieren des Änderungsdatenfeeds für die Nachverfolgung auf Zeilenebene

Der Änderungsdatenfeed von Delta Lake erfasst automatisch jede Änderung auf Zeilenebene. Wenn diese Option aktiviert ist, zeichnet die Laufzeit Änderungsereignisse mit Metadaten auf, die angeben, ob jede Zeile eingefügt, gelöscht oder aktualisiert wurde. Der Änderungsdatenfeed ist standardmäßig deaktiviert, daher sollten Sie ihn explizit für Tabellen aktivieren, für die Sie diese Funktion benötigen.

Um den Änderungsdaten-Feed für eine neue Tabelle zu aktivieren:

CREATE TABLE bronze.sales_transactions (
    transaction_id STRING,
    customer_id STRING,
    amount DECIMAL(10,2),
    transaction_date TIMESTAMP,
    source_file STRING,
    load_timestamp TIMESTAMP
)
USING DELTA
TBLPROPERTIES (delta.enableChangeDataFeed = true);

Aktivieren Sie für vorhandene Tabellen den Änderungsdatenfeed mit einer ALTER TABLE Anweisung:

ALTER TABLE bronze.sales_transactions 
SET TBLPROPERTIES (delta.enableChangeDataFeed = true);

Von Bedeutung

Der Datenfeed zeichnet nur Änderungen auf, die nach seiner Aktivierung auftreten. Vergangene Änderungen an einer Tabelle werden nicht erfasst. Aktivieren Sie dieses Feature, bevor Sie Produktionsdaten laden.

Abfragen des Tabellenverlaufs

Sobald der Change Data Feed aktiviert ist, können Sie den Änderungsverlauf abfragen, um genau zu sehen, welche Modifikationen aufgetreten sind. Der Änderungsdatenfeed fügt Ihren Daten drei Metadatenspalten hinzu:

Kolumne Description
_change_type Der Typ der Änderung: insert, update_preimage, , update_postimageoder delete
_commit_version Die Delta-Protokollversion, die die Änderung enthält
_commit_timestamp Der Zeitstempel, zu dem die Änderung festgeschrieben wurde

Abfrageänderungen innerhalb eines bestimmten Zeitraums:

SELECT 
    transaction_id,
    amount,
    _change_type,
    _commit_version,
    _commit_timestamp
FROM table_changes('bronze.sales_transactions', '2026-01-01', '2026-01-31')
WHERE _change_type IN ('insert', 'update_postimage')
ORDER BY _commit_timestamp;

Diese Abfrage hilft beim Identifizieren, wann bestimmte Datensätze geändert wurden, was für das Debuggen von Datenqualitätsproblemen nützlich ist.

Verwenden Sie Zeitreisen für zeitpunktbezogene Abfragen

Delta Lake verwaltet ein Transaktionsprotokoll, das das Abfragen von Daten ermöglicht, wie sie zu einem beliebigen Zeitpunkt im Verlauf vorhanden sind. Diese Funktion unterstützt Debuggingszenarien, in denen Sie aktuelle Daten mit einem vorherigen Zustand vergleichen müssen.

Abfragen von Daten zu einem bestimmten Zeitstempel:

SELECT * FROM bronze.sales_transactions
TIMESTAMP AS OF '2026-01-15 14:30:00';

Abfragen von Daten in einer bestimmten Version:

SELECT * FROM bronze.sales_transactions
VERSION AS OF 42;

Um den vollständigen Verlauf der Vorgänge anzuzeigen, die in einer Tabelle vorgenommen wurden:

DESCRIBE HISTORY bronze.sales_transactions;

Die Verlaufsausgabe enthält den Vorgangstyp, den Zeitstempel, den Benutzer und detaillierte Metriken für jede Änderung.

Hinweis

Die Verfügbarkeit von Reisen hängt von den Aufbewahrungseinstellungen ab. Standardmäßig speichert Delta Lake Datendateien für 7 Tage und Protokolldateien für 30 Tage. Konfigurieren delta.deletedFileRetentionDuration und delta.logRetentionDuration für längere Aufbewahrungszeiträume.

Beibehalten des Änderungsverlaufs für die langfristige Überwachung

Da die integrierte Zeitreise von Delta Lake Aufbewahrungsgrenzwerte aufweist, sollten Sie Änderungsdaten in einer separaten Verlaufstabelle für langfristige Überwachungsanforderungen beibehalten. Dieser Ansatz erstellt einen permanenten Datensatz aller Änderungen.

Verwenden Sie strukturiertes Streaming zum kontinuierlichen Erfassen von Änderungen:

(spark.readStream
    .option("readChangeFeed", "true")
    .option("ignoreDeletes", "false")
    .table("bronze.sales_transactions")
    .writeStream
    .option("checkpointLocation", "/checkpoints/sales_history")
    .trigger(availableNow=True)
    .toTable("audit.sales_transactions_history")
)

Die readChangeFeed Option weist Spark an, den Änderungsdatenfeed zu lesen, der Änderungsereignisse auf Zeilenebene zurückgibt, einschließlich Einfügungen, Aktualisierungen und Löschvorgängen. Die ignoreDeletes Option steuert, ob Löschvorgänge im Datenstrom enthalten sind. Durch die Einstellung von false wird sichergestellt, dass gelöschte Datensätze in der Verlaufstabelle erfasst werden, wodurch ein vollständiger Prüfpfad aller Datenänderungen entsteht.

Die Verlaufstabelle enthält jedes Änderungsereignis mit vollständigen Metadaten, die Abfragen über die gesamte Lebensdauer Ihrer Daten ermöglichen, nicht nur über den Aufbewahrungszeitraum.

Tipp

Planen Sie den Verlaufserfassungsprozess, der nach jedem Laden der Daten ausgeführt werden soll. Mithilfe von trigger(availableNow=True) Prozessen werden alle verfügbaren Änderungen als Batch verarbeitet, was gut mit geplanten Workflows funktioniert.

Konfigurieren der Aufbewahrung für Complianceanforderungen

Für zeitliche Tabellen, die Compliance- oder behördliche Anforderungen unterstützen, konfigurieren Sie Aufbewahrungseinstellungen so, dass sie Ihren Anforderungen entsprechen:

ALTER TABLE bronze.sales_transactions 
SET TBLPROPERTIES (
    delta.logRetentionDuration = 'interval 90 days',
    delta.deletedFileRetentionDuration = 'interval 90 days'
);

Beide Eigenschaften müssen zusammen festgelegt werden. Das logRetentionDuration steuert, wie lange Verlaufsmetadaten aufbewahrt werden, während deletedFileRetentionDuration festlegt, wie lange gelöschte Datendateien beibehalten werden, bevor VACUUM sie entfernt.

Längere Aufbewahrungszeiträume erhöhen die Speicherkosten, bieten jedoch längere Zeit für den Reisezugriff und ändern die Verfügbarkeit von Datenfeeds für die Überwachung.

Wenn zeitliche Tabellen ordnungsgemäß konfiguriert sind, können Sie jede Änderung ihrer Daten von der Aufnahme bis hin zur Transformation nachverfolgen und sowohl betriebliche Debugging- als auch behördliche Complianceanforderungen unterstützen.