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.
Verwenden Sie die CREATE FLOW Anweisung, um Datenflüsse oder Rückfüllungen für Tabellen in einer Pipeline zu erstellen.
Note
CREATE FLOW Wenn man auf eine Streaming-Tabelle zielt, unterstützt es sowohl AUTO CDC ... INTO als auch REPLACE WHERE Flows. Eine verwaltete Tabelle, die mit CREATE TABLE ... FLOW erstellt wird, unterstützt keine Erfassung von Änderungsdaten: Ein AUTO CDC ... INTO Flow gegen eine verwaltete Tabelle schlägt mit MANAGED_TABLE_DOES_NOT_SUPPORT_CDCfehl.
CREATE FLOW In eine Streaming-Tabelle unterliegt dieser Einschränkung nicht. Siehe CREATE TABLE ... FLOW (Pipelines).
Syntax
CREATE FLOW flow_name [COMMENT comment] AS
{
AUTO CDC [ONCE] INTO target_table create_auto_cdc_flow_spec |
AUTO CDC [ONCE] INTO target_table create_auto_cdc_from_snapshot_spec |
INSERT [ONCE] INTO target_table BY NAME [ replace_using_spec | REPLACE WHERE condition ] query
}
create_auto_cdc_from_snapshot_spec
FROM SNAPSHOT ( snapshot_query )
[ WITH VERSION ( version_query ) ]
KEYS ( key [, ...] )
[ STORED AS { SCD TYPE 1 | SCD TYPE 2 } ]
[ TRACK HISTORY ON { col_list | * EXCEPT ( col_list ) } ]
replace_using_spec
REPLACE USING ( column_name [, ...] ) SEQUENCE BY sequence_column
Die Parameter
flow_name
Der Name des zu erstellenden Flusses.
KOMMENTAR
Eine optionale Beschreibung für den Fluss.
-
Eine
AUTO CDC ... INTOAnweisung, die den Ablauf mithilfe einercreate_auto_cdc_flow_specdefiniert. Sie müssen entweder eineAUTO CDC ... INTOAnweisung oder eineINSERT INTOAnweisung einschließen. Verwenden SieAUTO CDC ... INTObei Abfragen, wenn die Quellabfrage die Änderungsdatensemantik nutzt.Weitere Informationen finden Sie unter AUTO CDC INTO (Pipelines).
AUTO CDC ... AUS SNAPSHOT
Eine Aussage, die Änderungen durch Vergleich von Snapshots
AUTO CDC ... INTOableitet, anstatt einen Änderungsfeed zu lesen. Verwenden Sie dieses Formular, wenn die Datenerfassung von Änderungen im Quellcode nicht aktiviert ist und nur vollständige Schnappschüsse verfügbar sind. Die Quelle ist in zwei Teile spezifiziert: eine erforderlicheFROM SNAPSHOT (snapshot_query)Klausel, die die Snapshot-Daten liest, und eine optionaleWITH VERSION (version_query)Klausel, die die nächste Snapshot-Version auswählt. Erfahren Sie , wie AUTO CDC FROM SNAPSHOT funktioniert.AUS SNAPSHOT (snapshot_query)
Required. Eine Abfrage, die die Snapshot-Daten für die von der von ausgewählte Version ausliest
WITH VERSION (...). Die Engine diffifiziert das Ergebnis mit dem zuvor festgelegten Snapshot, um Einfügungen, Aktualisierungen und Löschungen abzuleiten, und führt diese mit der Zeilenidentität in das ZielKEYSzusammen undSTORED ASbestimmt, wie Änderungen gespeichert werden.Rufen current_snapshot_version() in dieser Abfrage auf, um auf die von ausgewählte
WITH VERSION (...)Version zuzugreifen. WennWITH VERSION (...)nicht spezifiziert ist,current_snapshot_version()ist innerhalb nicht aufrufbar.FROM SNAPSHOT (...)Wenn
WITH VERSION (...)weggelassen wird, liest die Engine die Quellcode direkt durchFROM SNAPSHOT (...), und die Snapshot-Abfrage wird nur während der Erstladezeit ausgeführt, während das Ziel keine zugeteilten Daten und keinen zugesagten Snapshot-Status hat. Bei jeder späteren Aktualisierung, wenn das Ziel bereits Daten enthält oder einen Snapshot-Status hat, scheitert der Fluss mitAUTO_CDC_FROM_SNAPSHOT_NON_EMPTY_TARGET_WITHOUT_VERSION. Um Snapshots über mehrere Updates hinweg zu verarbeiten, verwendenWITH VERSION (...)Sie .MIT VERSION (version_query)
Optional. Eine Abfrage, die die nächste Snapshot-Version auswählt, die verarbeitet wird. Es muss genau eine Spalte eines ordnenden Typs und entweder 0 oder 1 Zeile zurückgeben. Wenn sie 1 Zeile zurückgibt, muss der Wert nicht null sein. Die Spalte kann ein skalarer Wert sein, wie zum Beispiel a
BIGINT, oder aSTRUCT, dessen Felder alle ordnbar sind. Eine Versionsabfrage, die mehr als eine Spalte, mehr als eine Zeile oder einen Nullwert zurückgibt, scheitert im Fluss mitINVALID_AUTO_CDC_FROM_SNAPSHOT_VERSION_QUERY.Während eines Pipeline-Updates wiederholt die Engine folgende Schritte: Sie bewertet die Versionsabfrage; wenn die Abfrage 0 Zeilen zurückgibt, stoppt sie die Verarbeitung dieses Flows für das aktuelle Update; wenn die Abfrage 1 Zeile zurückgibt, stellt die Engine diesen Wert über current_snapshot_version(), bewertet die Snapshot-Abfrage, commit das resultierende Snapshot und stellt die committierte Version über last_snapshot_version(). Die Engine bewertet dann die Versionsabfrage erneut, um die nächste Version auszuwählen. Ein einzelnes Pipeline-Update verarbeitet Versionen der Reihe nach, bis die Versionsabfrage keine Zeilen mehr zurückgibt.
Jede nach einem erfolgreiche Commit zurückgegebene Version muss größer sein als die zuvor committierte Version; eine nicht wachsende Version scheitert bei der Aktualisierung mit
APPLY_CHANGES_FROM_SNAPSHOT_ERROR.OUT_OF_ORDER_SNAPSHOT_VERSION. Der Datentyp des Versionswerts muss über Snapshot-Comits hinweg unverändert bleiben; eine Änderung des Datentyps scheitert bei der Aktualisierung mitAUTO_CDC_FROM_SNAPSHOT_VERSION_SCHEMA_CHANGED. Eine vollständige Aktualisierung löscht den Status der persistierten Version.SCHLÜSSEL
Required. Die Primärschlüsselspalten werden verwendet, um Zeilen über Snapshots hinweg zur Änderungserkennung zu identifizieren.
STORED AS { SCD TYPE 1 | SCD TYPE 2 }Optional. Spezifiziert, wie Änderungen in der Zieltabelle gespeichert werden. Der Standardwert lautet
SCD TYPE 1.TRACK HISTORY ON { col_list | * EXCEPT (col_list) }Optional. Gilt nur mit
SCD TYPE 2. Spezifiziert, welche Spalten eine neue Historik-Zeile auslösen, wenn sie sich ändern. Stellen Sie entweder eine explizite Spaltenliste bereit oder* EXCEPT (col_list)verfolgen Sie jede Spalte außer den aufgeführten.
Snapshot CDC unterstützt
WHEREkeine oderSEQUENCE BY. Die Kreuz-Snapshot-Ordnung wird durchWITH VERSION (...)ausgedrückt.target_table
Die Tabelle, die aktualisiert werden soll. Dies muss eine Streamingtabelle sein.
INSERT IN
Definiert eine Tabellenabfrage, die in die Zieltabelle eingefügt wird. Wenn die Option nicht angegeben wird, muss es sich bei der
ONCEAbfrage um eine Streamingabfrage handeln. Verwenden Sie das STREAM-Schlüsselwort, um Streamingsemantik zum Lesen aus der Quelle zu verwenden. Wenn beim Lesen eine Änderung oder löschung in einem vorhandenen Datensatz auftritt, wird ein Fehler ausgelöst. Es ist am sichersten, aus statischen oder nur angefügten Quellen zu lesen. Zum Einlesen von Daten mit Änderungs-Commits können Sie Python und dieskipChangeCommitsOption zur Fehlerbehandlung verwenden.INSERT INTOschließt sich mitAUTO CDC ... INTOgegenseitig aus. Verwenden Sie diese FunktionAUTO CDC ... INTO, wenn die Quelldaten die Funktionalität für die Änderungsdatenerfassung (Change Data Capture, CDC) enthalten. Verwenden SieINSERT INTO, wenn die Quelle nicht verwendet wird.Weitere Informationen zum Streamen von Daten finden Sie unter Transformieren von Daten mit Pipelines.
ERSETZEN MIT ( column_name [, ...] ) SEQUENZ VON sequence_column
Important
Dieses Feature befindet sich in der Betaversion. Benötigt Databricks Runtime 18.2 und höher.
Definiert den Fluss als Fluss
REPLACE USING, der alle Zeilen in der Zieltabelle ersetzt, die mit den angegebenen Schlüsselspalten übereinstimmen, und alle anderen Zeilen unberührt lässt. Verwenden SieREPLACE USING, wenn Ihre Quelle eine Reihe von teilweisen Schnappschüssen ist, die nach Spalten verschlüsselt sind.SEQUENCE BYordnet die Updates so, dass die höchste Reihenfolge eines Schlüssels gewinnt, selbst wenn Updates nicht in der richtigen Reihenfolge eintreffen.Geben Sie mindestens eine Schlüsselspalte und genau eine
SEQUENCE BYSpalte an. Die Abfrage muss eine Streaming-Abfrage sein undBY NAMEist erforderlich.REPLACE USINGkann weder mitONCEnoch mitAUTO CDC ... INTOkombiniert werden.Weitere Informationen finden Sie unter Teilweise Snapshot-Ersetzung mit ERSETZEN UNTER Verwendung von Flows.
ERSETZE-Bedingung WHERE
Definiert den Fluss als einen
REPLACE WHEREFluss, der eine Ziel-Teilmenge der Zieltabelle neu berechnet und überschreibt. Bei jedem Update werden alle Zeilen im Zieltabellenabgleichconditiongelöscht, die Quellanfrage für denselben Prädikatbereich neu berechnet und die Ergebnisse eingefügt. Reihen, die nicht übereinstimmencondition, bleiben unberührt. Du musst das Prädikat nicht zur Quellanfrage hinzufügen; die Pipeline-Engine verwendet es automatisch beim Lesen aus der Quelle.REPLACE WHEREverwendet Batch-Semantik, sodass die Quellanfrage keine Streaming-Abfrage sein muss.BY NAMEist erforderlich.REPLACE WHEREKann nicht mitONCE,REPLACE USINGoderAUTO CDC ... INTOkombiniert werden.Weitere Informationen finden Sie unter Batch-Verarbeitung mit ERSETZEN-Flows WHERE und REPLACE WHERE Flows für eigenständige Streaming-Tabellen.
EINMAL
Definieren Sie optional den Fluss als einmaligen Ablauf, z. B. als Rückfüllvorgang. Die Verwendung von
ONCEändert den Ablauf auf zwei Arten:- Die Quelle
queryodercreate_auto_cdc_flow_specist keine Streamingtabelle. - Der Fluss wird standardmäßig einmal ausgeführt. Wenn die Pipeline mit einer vollständigen Aktualisierung aktualisiert wird, wird der
ONCEFlow erneut ausgeführt, um die Daten neu zu erstellen.
ONCEKann nicht mitREPLACE USINGverwendet werden, was eine Streaming-Quelle erfordert.- Die Quelle
Examples
-- EXAMPLE 1:
-- Create a streaming table, and add two flows that append data to it:
CREATE OR REFRESH STREAMING TABLE users;
-- first flow into target_table:
CREATE FLOW users_flow AS
INSERT INTO users BY NAME
SELECT * FROM stream(raw_data.users);
-- second flow into target_table:
CREATE FLOW backfill_users AS
INSERT ONCE INTO users BY NAME
SELECT * FROM user_backfill_table;
-- EXAMPLE 2:
-- Create a streaming table, and add a flow that applies CDC changes to it:
CREATE OR REFRESH STREAMING TABLE admins_cdc_target_table;
-- first flow into target_table:
CREATE FLOW admin_cdc_flow AS
AUTO CDC INTO admins_cdc_target_table
FROM stream(cdc_data.admins)
KEYS (userId)
APPLY AS DELETE WHEN
operation = "DELETE"
SEQUENCE BY sequenceNum
COLUMNS * EXCEPT (operation, sequenceNum)
STORED AS SCD TYPE 2;
-- EXAMPLE 3:
-- Create a streaming table, and add a REPLACE USING flow that keeps the latest
-- row for each payment_id from a stream of partial snapshots:
CREATE OR REFRESH STREAMING TABLE payments_latest;
CREATE FLOW payments_replace_flow AS
INSERT INTO payments_latest BY NAME
REPLACE USING (payment_id) SEQUENCE BY payment_date
SELECT payment_id, booking_id, status, payment_date
FROM STREAM(samples.wanderbricks.payments);
-- EXAMPLE 4:
-- AUTO CDC FROM SNAPSHOT without WITH VERSION: a one-time initial load from a snapshot table.
-- To process later snapshots on each update, add WITH VERSION (see EXAMPLE 5).
CREATE STREAMING TABLE users (user_id INT, name STRING, email STRING);
CREATE FLOW users_snapshot_flow AS
AUTO CDC ONCE INTO users
FROM SNAPSHOT (SELECT * FROM catalog.schema.users_snapshot)
KEYS (user_id)
STORED AS SCD TYPE 1;
-- EXAMPLE 5:
-- AUTO CDC FROM SNAPSHOT with WITH VERSION: pick the next file, then read it as the snapshot:
CREATE STREAMING TABLE orders (order_id INT, product STRING, quantity INT, order_date DATE);
CREATE FLOW orders_cdc AS
AUTO CDC INTO orders
FROM SNAPSHOT (
SELECT order_id, product, quantity, order_date
FROM read_files('/Volumes/catalog/schema/landing/orders/', format => 'json')
WHERE _metadata.file_path = (SELECT version.path FROM current_snapshot_version())
)
WITH VERSION (
SELECT struct(modification_time, path) AS version
FROM list_files('/Volumes/catalog/schema/landing/orders/')
WHERE (
NOT EXISTS (SELECT 1 FROM last_snapshot_version())
OR struct(modification_time, path) > (SELECT version FROM last_snapshot_version())
)
ORDER BY modification_time, path
LIMIT 1
)
KEYS (order_id)
STORED AS SCD TYPE 2;
-- EXAMPLE 6:
-- One-time snapshot backfill plus a streaming CDC flow into the same target.
-- The backfill omits WITH VERSION, so it uses an implicit timestamp version. The
-- streaming flow's SEQUENCE BY column (event_ts) must be a TIMESTAMP so its type
-- matches that implicit version on the shared target.
CREATE STREAMING TABLE customers (
customer_id INT, name STRING, email STRING, address STRING, event_ts TIMESTAMP
);
CREATE FLOW customers_snapshot_backfill AS
AUTO CDC ONCE INTO customers
FROM SNAPSHOT (SELECT * FROM catalog.schema.customers_snapshot)
KEYS (customer_id)
STORED AS SCD TYPE 1;
CREATE FLOW customers_cdc AS
AUTO CDC INTO customers
FROM STREAM(customers_cdc_events)
KEYS (customer_id)
SEQUENCE BY event_ts
STORED AS SCD TYPE 1;
-- EXAMPLE 7:
-- Create a streaming table, then add a REPLACE WHERE flow that recomputes and
-- overwrites a targeted window of the target table on each update:
CREATE STREAMING TABLE payments_latest;
CREATE FLOW payments_latest AS
INSERT INTO payments_latest BY NAME
REPLACE WHERE payment_date >= date_add(current_date(), -7)
SELECT payment_id, booking_id, status, payment_date
FROM samples.wanderbricks.payments;
Weitere Informationen zur Kombination eines einmaligen Backfill mit laufendem CDC auf demselben Ziel finden Sie unter Backfilling historische Daten mit Pipelines.