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.
Über die grundlegenden AUTO CDC und AUTO CDC FROM SNAPSHOT APIs hinaus können Sie DML für Zieltabellen ausführen, Änderungsdatenfeeds von CDC-Zielen lesen, Verarbeitungsmetriken überwachen, Teilaktualisierungen anwenden und Änderungen mit bitemporaler Speicher nachverfolgen. Eine Einführung in die AUTO CDC APIs finden Sie unter "Auto CDC-APIs: Vereinfachen der Änderungsdatenerfassung mit Pipelines".
Hinzufügen, Ändern oder Löschen von Daten in einer Zielstreamingtabelle
Wenn Ihre Pipeline Tabellen im Unity-Katalog veröffentlicht, können Sie DML-Anweisungen (Data Manipulation Language ) verwenden, einschließlich Einfüge-, Aktualisierungs-, Lösch- und Zusammenführungsanweisungen, um die von AUTO CDC ... INTO Anweisungen erstellten Zielstreamingtabellen zu ändern.
Hinweis
- DML-Anweisungen, die das Tabellenschema einer Streamingtabelle ändern, werden nicht unterstützt. Stellen Sie sicher, dass Ihre DML-Anweisungen nicht versuchen, das Tabellenschema weiterzuentwickeln.
- DML-Anweisungen, die eine Streamingtabelle aktualisieren, können nur in einem freigegebenen Unity Catalog-Cluster oder einem SQL-Warehouse mit Databricks Runtime 13.3 LTS und höher ausgeführt werden.
- Da für das Streaming Datenquellen im Nur-Anfügen-Modus benötigt werden, legen Sie das Flag skipChangeCommits beim Lesen der Streamingquelltabelle fest, wenn Ihre Verarbeitung Streaming aus einer Streamingquelltabelle mit Änderungen (z. B. durch DML-Anweisungen) erfordert. Wenn
skipChangeCommitsfestgelegt ist, werden Transaktionen, die Datensätze in der Quelltabelle löschen oder ändern, ignoriert. Wenn Ihre Verarbeitung keine Streamingtabelle erfordert, können Sie eine materialisierte Ansicht (die nicht die Einschränkung „nur Anhängen“ hat) als Zieltabelle verwenden.
Da die Pipeline eine angegebene SEQUENCE BY Spalte verwendet und geeignete Sequenzierungswerte an die __START_AT Und __END_AT Spalten der Zieltabelle (für SCD Type 2) verteilt, müssen Sie sicherstellen, dass DML-Anweisungen gültige Werte für diese Spalten verwenden, um die richtige Reihenfolge von Datensätzen beizubehalten. Erfahren Sie , wie AUTO CDC funktioniert.
Weitere Informationen zur Verwendung von DML-Anweisungen mit Streamingtabellen finden Sie unter Hinzufügen, Ändern oder Löschen von Daten in einer Streamingtabelle.
Im folgenden Beispiel wird ein aktiver Datensatz mit einer Startsequenz von 5 eingefügt.
INSERT INTO my_streaming_table (id, name, __START_AT, __END_AT) VALUES (123, 'John Doe', 5, NULL);
Tipp
Wenn Sie die Spalten __START_AT und __END_AT in Ihrer SCD Typ 2-Zieltabelle umbenennen müssen (z. B. um nachgelagerte Schemaanforderungen zu erfüllen), erstellen Sie eine Sicht über der Zieltabelle:
CREATE VIEW my_employees_view AS
SELECT
*,
__START_AT AS valid_from,
__END_AT AS valid_to
FROM my_scd2_target_table;
Einen Änderungsdaten-Feed aus einer AUTO CDC-Zieltabelle lesen
In Databricks Runtime 15.2 und höher können Sie einen Änderungsdatenfeed aus einer Streamingtabelle lesen, die das Ziel von AUTO CDC- oder AUTO CDC FROM SNAPSHOT-Abfragen ist, auf die gleiche Weise, wie Sie einen Änderungsdatenfeed aus anderen Delta-Tabellen lesen. Folgendes ist erforderlich, um den Änderungsdatenfeed aus einer Ziel-Streamingtabelle zu lesen:
- Die Zielstreamingtabelle muss im Unity-Katalog veröffentlicht werden. Siehe Verwenden des Unity-Katalogs mit Pipelines.
- Um den Änderungsdatenfeed aus der Zielstreamingtabelle zu lesen, müssen Sie Databricks Runtime 15.2 oder höher verwenden. Um den Änderungsdatenfeed in einer anderen Pipeline zu lesen, muss die Pipeline für die Verwendung von Databricks Runtime 15.2 oder höher konfiguriert sein.
Sie lesen den Änderungsdatenfeed aus einer Zielstreamingtabelle, die in einer Lakeflow-Pipeline erstellt wurde, auf die gleiche Weise, wie Sie einen Änderungsdatenfeed aus anderen Delta-Tabellen lesen. Weitere Informationen zur Verwendung der Delta-Änderungsdatenfeedfunktionen, einschließlich Beispiele in Python und SQL, finden Sie unter Verwenden des Änderungsdatenfeeds auf Azure Databricks.
Hinweis
Der Datensatz für Änderungsdatenfeed enthält Metadaten , die den Typ des Änderungsereignisses identifizieren. Wenn ein Datensatz in einer Tabelle aktualisiert wird, werden die Metadaten für die zugehörigen Änderungsdatensätze typischerweise mit _change_type-Werten versehen, die auf update_preimage und update_postimage-Ereignisse festgelegt sind.
Die _change_type Werte unterscheiden sich jedoch, wenn Aktualisierungen an der Zielstreamingtabelle vorgenommen werden, die änderungen der Primärschlüsselwerte umfassen. Wenn Änderungen Aktualisierungen an Primärschlüsseln enthalten, werden die _change_type Metadatenfelder auf insert und delete Ereignisse festgelegt. Änderungen an Primärschlüsseln können auftreten, wenn manuelle Aktualisierungen an einem der Schlüsselfelder mit einer UPDATE oder MERGE Anweisung gemacht werden oder bei SCD-Typ 2-Tabellen, wenn sich das __start_at Feld ändert, um einen früheren Startsequenzwert wiederzugeben.
Die AUTO CDC Abfrage bestimmt die Primärschlüsselwerte, die sich für die SCD-Typ 1- und SCD-Typ 2-Verarbeitung unterscheiden:
| SCD-Typ | Primärschlüssel |
|---|---|
| SCD-Typ 1 und die Python-Schnittstelle für Pipelines | Der Primärschlüssel ist der Wert des keys Parameters in der create_auto_cdc_flow() Funktion. Für die SQL-Schnittstelle ist der Primärschlüssel die durch die Klausel in der KEYSAUTO CDC ... INTO Anweisung definierten Spalten. |
| SCD Typ 2 | Der Primärschlüssel ist der keys Parameter oder die KEYS Klausel zusammen mit dem Rückgabewert des coalesce(__START_AT, __END_AT) Vorgangs, wobei __START_AT und __END_AT die entsprechenden Spalten der Zielstreamingtabelle sind. Hierbei wird __START_AT verwendet, wenn verfügbar, und __END_AT, wenn __START_AT null ist (z. B. beim ersten Datensatz). |
Lesen Sie einen Änderungsdatenfeed aus einer materialisierten Ansicht
Important
Dieses Feature befindet sich in der Betaversion. Arbeitsbereichsadministratoren können den Zugriff auf dieses Feature über die Vorschauseite steuern. Siehe Manage Azure Databricks Previews.
Du kannst einen Change Data Feed aus einer materialisierten Ansicht lesen, die in einer Lakeflow-Pipeline oder in Databricks SQL erstellt wurde. Nutzen Sie dies, um materialisierte Ansichtsänderungen auf Ziele außerhalb von Azure Databricks zu replizieren oder um eine Historie materialisierter Ansichtsänderungen für Audits und Berichterstattung zu führen.
Materialisierte Ansichten verwenden den automatischen Änderungsdatenfeed, sodass Sie den Änderungsdaten-Feed selbst nicht aktivieren. Stattdessen aktivieren Sie den Änderungsdaten-Feed für jede materialisierte Ansicht, für die Sie es benötigen, indem Sie die folgenden Anforderungen erfüllen. Siehe "Datenfeed für automatische Änderung".
Um den Change Data Feed zu lesen, müssen Sie Databricks Runtime 18 LTS oder höher verwenden, auf Classic Compute, serverless Compute oder Databricks SQL.
Die materialisierte Ansicht, die Pipeline, die sie erzeugt, oder die Pipeline, die sie liest, müssen den Kanal
PREVIEWverwenden.Die materialisierte Ansicht muss Zeilenverfolgung aktiviert haben. Materialisierte Ansichten auf serverloser Berechnung haben standardmäßig Zeilenverfolgung aktiviert. Siehe Zeilenverfolgung in Azure Databricks. Um zu überprüfen, ob Zeilenverfolgung in einer materialisierten Ansicht aktiviert ist, führen Sie aus:
SHOW TBLPROPERTIES my_mv ('delta.enableRowTracking');Die materialisierten View-Metadaten müssen so synchronisiert werden, dass sie außerhalb ihrer eigenen Pipeline lesbar sind:
Für eine materialisierte Ansicht, die in einer Pipeline erstellt wurde, setzen
pipelines.externalMetadata.enabledSie in der Pipeline-Konfiguration:{ "configuration": { "pipelines.externalMetadata.enabled": "true" } }Für eine eigenständige materialisierte Ansicht führen Sie den folgenden Befehl einmal auf jeder materialisierten Ansicht aus. Dieser Befehl benötigt die externe Zugriffsvorschau für materialisierte Ansichten und Streaming-Tabellen. Siehe Aktivieren des externen Datenzugriffs für Streamingtabellen und materialisierte Ansichten.
REPAIR TABLE my_mv SYNC METADATA;
Man liest den Änderungsdaten-Feed aus einer materialisierten Ansicht genauso wie aus anderen Delta-Tabellen, indem man die Funktion table_changes() , eine Streaming-Lektüre oder die Option readChangeFeed verwendet. Für Syntax und Beispiele in SQL und Python siehe Use change data feed in Azure Databricks.
Um einen materialisierten View Change Data Feed aus einer Databricks SQL-Materialisier-Ansicht oder Streaming-Tabelle zu lesen, muss diese materialisierte Ansicht oder Streaming-Tabelle ebenfalls den Kanal PREVIEW verwenden:
CREATE OR REFRESH STREAMING TABLE sales
TBLPROPERTIES ('pipelines.channel' = 'preview')
AS SELECT * FROM STREAM my_mv WITH (readChangeFeed=true)
Einschränkungen
Zusätzlich zu den automatischen Einschränkungen des Änderungsdatenfeeds gelten Folgendes, wenn Sie einen Änderungsdatenfeed aus einer materialisierten Ansicht lesen:
- Der Änderungsdatenfeed enthält unveränderte Zeilen, wenn die materialisierte Ansicht vollständig umgeschrieben ist, und konsolidiert nicht mehrere Aktualisierungen derselben Zeile zu einem einzigen Ereignis. Um diese herauszufiltern, aggregieren Sie den Änderungsdatenfeed, indem Sie alle Spalten gruppieren, um Einfügungen und Löschungen mit denselben Zeilenwerten zu finden.
- Nur Azure Databricks können den Change Data Feed für eine materialisierte Ansicht abfragen. Externe Kunden von Delta Lake und Iceberg können das nicht.
- Innerhalb von Lakeflow-Pipelines kann man einen materialisierten View-Change-Datenfeed nur aus einer anderen Pipeline lesen, und diese Pipeline muss den Kanal
PREVIEWverwenden. Das Lesen des Änderungsdatenfeeds einer materialisierten Ansicht in derselben Pipeline, die sie erstellt, wird nicht unterstützt. - Man kann keinen Vektorsuchindex aus einer materialisierten Ansicht erstellen.
Daten zu Datensätzen abrufen, die durch eine CDC-Abfrage in Pipelines verarbeitet wurden
Hinweis
Die folgenden Metriken werden nur von AUTO CDC Abfragen und nicht von AUTO CDC FROM SNAPSHOT Abfragen erfasst.
Die folgenden Metriken werden von AUTO CDC Abfragen erfasst:
-
num_upserted_rows: Die Anzahl der Ausgabezeilen, die während einer Aktualisierung in das Dataset eingefügt wurden. -
num_deleted_rows: Die Anzahl vorhandener Ausgabezeilen, die während einer Aktualisierung aus dem Dataset gelöscht wurden.
Die Metrik „num_output_rows“, die für Nicht-CDC-Flows ausgegeben wird, wird nicht für AUTO CDC-Abfragen erfasst.
Anwenden teilweiser Updates
Wenn eine Quelle nur die geänderten Spalten sendet, muss zwischen einer Spalte unterschieden werden, AUTO CDC die nicht in einem Änderungsdatensatz vorhanden ist, wodurch der Zielwert unverändert bleiben soll, und einer Spalte, die explizit festgelegt nullist, die den Zielwert nullmit überschreiben soll. Behandelt standardmäßig IGNORE NULL UPDATES jede null Markierung als "Nicht aktualisieren"-Markierung, sodass keine explizite Anwendung möglich nullist. Um diese Mehrdeutigkeit zu beheben, wählen Sie eine der folgenden drei Methoden aus:
| Method | Wann verwenden? | Behavior |
|---|---|---|
IGNORE NULL UPDATES ON columnList |
Ein kleiner, fester Spaltensatz sollte Werte ignorieren null , während alle anderen Spalten explizite null Werte anwenden. |
Die aufgelisteten Spalten behalten ihren vorhandenen Zielwert bei, wenn der eingehende Wert ist null. Alle anderen Spalten wenden explizite null Werte an. |
IGNORE NULL UPDATES ON * EXCEPT (exceptColumnList) |
Die meisten Spalten sollten Werte ignorieren null , und nur einige wenige sollten explizite null Werte anwenden. |
Die aufgelisteten Spalten wenden explizite null Werte an. Alle anderen Spalten behalten ihren vorhandenen Zielwert bei, wenn der eingehende Wert ist null. |
COLUMNS TO UPDATE |
Jeder Änderungsdatensatz aktualisiert eine andere Gruppe von Spalten, oder die Gruppe aktualisierbarer Spalten ändert sich im Laufe der Zeit. | Eine Quellspalte benennt die Spalten, die für jeden Änderungsdatensatz aktualisiert werden sollen. Die aufgelisteten Spalten werden aus der Quelle geschrieben, einschließlich expliziter null Werte. Spalten, die nicht aufgelistet sind, behalten ihren vorhandenen Zielwert bei. |
COLUMNS TO UPDATE kann nicht mit IGNORE NULL UPDATES, und wird für bitemporale Tabellen nicht unterstützt.
Wählen Sie als Faustregel aus COLUMNS TO UPDATE , wann der Produzent weiß, welche Spalten in jedem Datensatz geändert wurden, und diese Informationen in einer Quellspalte übertragen können, z. B. wenn mehrere Produzenten in dieselbe Quelle schreiben oder die Einrichtung aktualisierbarer Spalten im Laufe der Zeit wächst. Wählen Sie aus IGNORE NULL UPDATES ON , wann der Pipelinebesitzer den festen Satz aktualisierbarer Spalten im Voraus kennt und bevorzugt, sie im Pipelinecode zu steuern.
Im folgenden Beispiel wird eine Quellspalte mit dem Namen columnsToUpdate verwendet, um zu steuern, welche Spalten die einzelnen Datensatzänderungen aktualisieren, einschließlich spalten, die explizit auf null:
Python
from pyspark import pipelines as dp
dp.create_streaming_table("target")
dp.create_auto_cdc_flow(
target = "target",
source = "cdc_source",
keys = ["id"],
sequence_by = "sequenceNum",
stored_as_scd_type = 1,
columns_to_update = "columnsToUpdate"
)
SQL
CREATE OR REFRESH STREAMING TABLE target;
CREATE FLOW apply_cdc AS AUTO CDC INTO
target
FROM
stream(cdc_source)
KEYS
(id)
SEQUENCE BY
sequenceNum
STORED AS
SCD TYPE 1
COLUMNS TO UPDATE
columnsToUpdate;
Die vollständige Parameterreferenz finden Sie unter AUTO CDC INTO (Pipelines) und create_auto_cdc_flow.
Bitemporales AUTO CDC
Important
Bitemporal AUTO CDC befindet sich in Der Betaversion.
SCD Typ 1 und Typ 2 sind unitemporal: Sie verfolgen Änderungen über eine einzelne Zeitdimension hinweg. Bitemporal erweitert den SCD Typ 2-Verlauf, um Änderungen über zwei Zeitdimensionen nachzuverfolgen und zwischen zwei Perspektiven zu unterscheiden:
- Geschäftszeit: Wann das Ereignis tatsächlich passiert ist.
- Systemzeit: wenn das System das Ereignis aufgezeichnet oder erfasst hat.
Wie SCD Typ 2 bewahrt bitemporal eine vollständige Historie von Datensätzen. Es fügt eine zweite Zeitachse hinzu, sodass Sie sowohl die angezeigten Daten als auch das, was das System an einem beliebigen Punkt in der Vergangenheit glaubte, rekonstruieren können.
Beispielsweise erfasst ein Hedgefonds Aktiendaten aus einem Quellsystem. Der Aktienkurs von Acme Corp ändert sich am 1. Januar, aber der Fonds übernimmt diese Aktualisierung erst am 5. Januar. Bitemporal AUTO CDC lässt den Fonds zwei verschiedene Fragen beantworten: Was der tatsächliche Aktienkurs von Acme Corp am 1. Januar (Geschäftszeit) war und welcher Preis das System glaubte, als der Fonds am 3. Januar Handelsentscheidungen getroffen hat (Systemzeit). Die Möglichkeit, zwischen diesen Zeitachsen zu unterscheiden, ist nützlich für die Prüfung, regulatorische Berichterstattung und die entscheidungsfindung im Finanzwesen.
Um die bitemporale Verarbeitung zu ermöglichen, legen Sie STORED AS BITEMPORAL (SQL) oder stored_as_scd_type="bitemporal" (Python) fest, verwenden Sie SEQUENCE BY die Geschäftszeitspalte und verwenden Sie SYSTEM SEQUENCE BY sie für die Systemzeitspalte. Die Zieltabelle fügt __SYSTEM_START_AT und __SYSTEM_END_AT Spalten zusammen mit den SCD-Typ 2 __START_AT und __END_AT Spalten hinzu. Ausführliche Informationen zur Syntax finden Sie unter AUTO CDC INTO (Pipelines) oder create_auto_cdc_flow.
Bitemporale AUTO CDC-Beispiele
Im folgenden Beispiel wird eine bitemporale Zieltabelle aus einer kleinen Gruppe synthetischer CDC-Ereignisse erstellt. Die bt Spalte weist die Geschäftszeit auf, und die st Spalte hat die Systemzeit.
Python
from pyspark import pipelines as dp
# Source: synthetic CDC events
dp.create_streaming_table(name="cdc_source")
@dp.append_flow(target="cdc_source", once=True)
def load_cdc_source():
return spark.createDataFrame(
[
(1, "x10", "y10", 10, 100),
(1, "x20", "y20", 20, 200)
],
schema="id INT, x STRING, y STRING, bt INT, st INT",
)
# Target: bitemporal table
dp.create_streaming_table(name="target_bitemporal")
dp.create_auto_cdc_flow(
target = "target_bitemporal",
source = "cdc_source",
keys = ["id"],
sequence_by = "bt",
system_sequence_by = "st",
stored_as_scd_type = "bitemporal"
)
SQL
-- Source: synthetic CDC events
CREATE OR REFRESH STREAMING TABLE cdc_source_sql;
CREATE FLOW cdc_source_sql AS INSERT INTO ONCE
cdc_source_sql BY NAME
SELECT * FROM VALUES
(1, 'x10', 'y10', 10, 100),
(1, 'x20', 'y20', 20, 200)
AS t(id, x, y, bt, st);
-- Target: bitemporal table
CREATE OR REFRESH STREAMING TABLE target_bitemporal_sql;
CREATE FLOW target_bitemporal_sql AS AUTO CDC INTO
target_bitemporal_sql
FROM
stream(cdc_source_sql)
KEYS
(id)
SEQUENCE BY
bt
SYSTEM SEQUENCE BY
st
STORED AS
BITEMPORAL;
Die folgende Reihenfolge der Änderungen zeigt, wie eine bitemporale Tabelle einen Einfügevorgang, eine Aktualisierung, ein Out-of-Order-Update und ein Löschvorgang für ein einzelnes Unternehmen aufzeichnet. Die Sequenzierungsspalte generiert die __START_AT Spalten und __END_AT (Geschäftszeit) und die Spalte für die Systemsequenzierung generiert die __SYSTEM_START_AT Spalten und __SYSTEM_END_AT (Systemzeit):
| Column | Description |
|---|---|
__START_AT |
Die Geschäftszeit, zu der diese Zeile gültig wurde. |
__END_AT |
Die Geschäftszeit, zu der die Gültigkeit dieser Zeile endet.
null wenn sie unbegrenzt gültig ist. |
__SYSTEM_START_AT |
Die Systemzeit, zu der die Daten und das Geschäftszeitintervall dieser Zeile als gültig bekannt sind. |
__SYSTEM_END_AT |
Die Systemzeit, zu der bekannt ist, dass die Daten dieser Zeile und ihr Geschäftszeitintervall als ungültig erkannt wurden.
null wenn bekannt, dass sie unbegrenzt wahr ist. |
Das System behandelt Ereignisse, die in beliebiger Reihenfolge auf beiden Zeitachsen eingehen. Wenn ein Ereignis mit einer früheren Geschäfts- oder Systemzeit als bereits verarbeitete Ereignisse eintrifft, korrigiert das System den betroffenen Verlauf, anstatt ihn nur am Ende anzufügen.
Änderung 1: Einfügen
Firma A wird am 18.07.2025 um 10:01:00 (Business-Zeit) hinzugefügt, jedoch erst um 10:05:00 (Systemzeit) ins System übernommen.
Eingabe:
| CompanyId | Datenpunkt | Abfolge | Systemreihenfolge | Operation |
|---|---|---|---|---|
| Ein | XFv1 | 7/18/2025 10:01:00 | 7/18/2025 10:05:00 | INSERT |
Ausgabe:
| CompanyId | Datenpunkt | __START_AT | __END_AT | __SYSTEM_START_AT | __SYSTEM_END_AT |
|---|---|---|---|---|---|
| Ein | XFv1 | 7/18/2025 10:01:00 | NULL | 7/18/2025 10:05:00 | NULL |
XFv1 gilt ab 10:01:00 Uhr ohne bekanntes Ende. Das System erfuhr von dieser Tatsache um die Systemzeit 10:05:00, wobei kein Ende bekannt ist.
Änderung 2: Aktualisieren
Unternehmen A wurde am 18.07.2025 um 12:15:43 (Geschäftszeit) aktualisiert, und das System verarbeitet das Ereignis um 12:20:00 (Systemzeit). Das System behält sowohl das, was es glaubte, bevor das Update bekannt war, als auch den korrigierten Geschäftsverlauf nach der Aufnahme des Updates.
Eingabe:
| CompanyId | Datenpunkt | Abfolge | Systemreihenfolge | Operation |
|---|---|---|---|---|
| Ein | XFv2 | 7/18/2025 12:15:43 | 7/18/2025 12:20:00 | UPDATE |
Ausgabe:
| CompanyId | Datenpunkt | __START_AT | __END_AT | __SYSTEM_START_AT | __SYSTEM_END_AT |
|---|---|---|---|---|---|
| Ein | XFv1 | 7/18/2025 10:01:00 | NULL | 7/18/2025 10:05:00 | 7/18/2025 12:20:00 |
| Ein | XFv1 | 7/18/2025 10:01:00 | 7/18/2025 12:15:43 | 7/18/2025 12:20:00 | NULL |
| Ein | XFv2 | 7/18/2025 12:15:43 | NULL | 7/18/2025 12:20:00 | NULL |
Es wurde angenommen, dass XFv1 ab 10:01:00 gültig war, ohne bekanntes Ende der Gültigkeit, und das System ging von 10:05:00 bis 12:20:00 davon aus. XFv1 gilt nach aktuellem Kenntnisstand nur bis 12:15:43; eine korrigierte Historie ist ab Systemzeit 12:20:00 ohne bekanntes Ende gültig. XFv2 ist ab 12:15:43 ohne bekanntes Ende gültig und wurde zur Systemzeit 12:20:00 Uhr gelernt.
Änderung 3: Out-of-Order-Update
Ein Update außerhalb der Reihenfolge trifft ein, das angibt, dass Unternehmen A tatsächlich am 18.07.2025 um 12:05:00 Uhr (Geschäftszeit) aktualisiert wurde, aber erst um 12:25:00 Uhr (Systemzeit) erfasst wird. Wenn ein Update später in der Systemzeit eintrifft, aber mit einer vorherigen Geschäftszeit, korrigiert das System die historische Geschäftszeit und behält sowohl das, was es vor dem Out-of-Order-Update als auch dem korrigierten Verlauf glaubte.
Eingabe:
| CompanyId | Datenpunkt | Abfolge | Systemreihenfolge | Operation |
|---|---|---|---|---|
| Ein | XFv3 | 7/18/2025 12:05:00 | 7/18/2025 12:25:00 | UPDATE |
Ausgabe:
| CompanyId | Datenpunkt | __START_AT | __END_AT | __SYSTEM_START_AT | __SYSTEM_END_AT |
|---|---|---|---|---|---|
| Ein | XFv1 | 7/18/2025 10:01:00 | NULL | 7/18/2025 10:05:00 | 7/18/2025 12:20:00 |
| Ein | XFv1 | 7/18/2025 10:01:00 | 7/18/2025 12:15:43 | 7/18/2025 12:20:00 | 7/18/2025 12:25:00 |
| Ein | XFv1 | 7/18/2025 10:01:00 | 7/18/2025 12:05:00 | 7/18/2025 12:25:00 | NULL |
| Ein | XFv3 | 7/18/2025 12:05:00 | 7/18/2025 12:15:43 | 7/18/2025 12:25:00 | NULL |
| Ein | XFv2 | 7/18/2025 12:15:43 | NULL | 7/18/2025 12:20:00 | NULL |
XFv1 wurde von 10:01:00 bis 12:15:43 als gültig angesehen, und diese Annahme ist jetzt in der Systemzeit bis 12:25:00 gültig. Das neue Update korrigiert die geschäftliche Gültigkeit von XFv1 so, dass sie um 12:05:00 Uhr endet, wobei der korrigierte Verlauf ab der Systemzeit 12:25:00 Uhr wirksam ist. XFv3 gilt jetzt als von 12:05:00 bis 12:15:43 gültig, wobei diese Erkenntnis in der Systemzeit ab 12:25:00 gültig ist und kein bekanntes Ende hat.
Änderung 4: Löschen
Firma A wird am 18.07.2025 um 12:30:00 Uhr gelöscht, und das System verarbeitet das Ereignis um 12:30:00 Uhr. Da ein Löschvorgang das Ende des Geschäftsbestands der Entität darstellt, erstellt das System keine Ersetzungszeile. XFv2 wird in zwei Zeilen angezeigt, sodass ein vollständiger Audit-Trail sowohl darüber erhalten bleibt, wann das Unternehmen aufhörte zu existieren, als auch darüber, wann das System von der Löschung erfuhr.
Eingabe:
| CompanyId | Datenpunkt | Abfolge | Systemreihenfolge | Operation |
|---|---|---|---|---|
| Ein | XFv2 | 7/18/2025 12:30:00 | 7/18/2025 12:30:00 | DELETE |
Ausgabe:
| CompanyId | Datenpunkt | __START_AT | __END_AT | __SYSTEM_START_AT | __SYSTEM_END_AT |
|---|---|---|---|---|---|
| Ein | XFv1 | 7/18/2025 10:01:00 | NULL | 7/18/2025 10:05:00 | 7/18/2025 12:20:00 |
| Ein | XFv1 | 7/18/2025 10:01:00 | 7/18/2025 12:15:43 | 7/18/2025 12:20:00 | 7/18/2025 12:25:00 |
| Ein | XFv1 | 7/18/2025 10:01:00 | 7/18/2025 12:05:00 | 7/18/2025 12:25:00 | NULL |
| Ein | XFv3 | 7/18/2025 12:05:00 | 7/18/2025 12:15:43 | 7/18/2025 12:25:00 | NULL |
| Ein | XFv2 | 7/18/2025 12:15:43 | NULL | 7/18/2025 12:20:00 | 7/18/2025 12:30:00 |
| Ein | XFv2 | 7/18/2025 12:15:43 | 7/18/2025 12:30:00 | 7/18/2025 12:30:00 | NULL |
XFv2 war ab 12:15:43 gültig, ohne bekannten Endzeitpunkt, und das System ging von 12:20:00 bis 12:30:00 davon aus. Nachdem die Löschung eingelesen wurde, ist bekannt, dass XFv2 nur bis 12:30:00 gültig ist, wobei ab der Systemzeit 12:30:00 ein korrigierter Verlauf gilt.
Welche Datenobjekte werden für die CDC-Verarbeitung in einer Pipeline verwendet?
Wenn Sie die Zieltabelle im Hive-Metaspeicher deklarieren, werden zwei Datenstrukturen erstellt:
- Eine Ansicht mit dem Namen, der der Zieltabelle zugewiesen ist.
- Eine interne Sicherungstabelle, die von der Pipeline zum Verwalten der CDC-Verarbeitung verwendet wird. Diese Tabelle wird benannt, indem
__apply_changes_storage_an den Zieltabellennamen vorangestellt wird.
Wenn Sie z. B. eine Zieltabelle mit dem Namen dp_cdc_target deklarieren, wird eine Ansicht namens dp_cdc_target und eine Tabelle namens __apply_changes_storage_dp_cdc_target im Metastore angezeigt. Fragen Sie die Sicht ab, um auf die verarbeiteten Daten zuzugreifen. Ändern Sie die zugrunde stehenden Tabellen nicht direkt.
Hinweis
Diese Datenstrukturen gelten nur für die AUTO CDC-Verarbeitung, nicht für die AUTO CDC FROM SNAPSHOT-Verarbeitung. Sie gelten auch nur für den Hive-Metaspeicher, nicht für den Unity-Katalog.