Eine inkrementelle Tabelle
Dataform aktualisiert Tabellen je nach Tabellentyp unterschiedlich. Bei jeder Ausführung einer Tabelle oder Ansicht erstellt Dataform die gesamte Tabelle oder Ansicht neu.
Wenn Sie eine inkrementelle Tabelle definieren, erstellt Dataform diese Tabelle zum ersten Mal von Grund auf neu. Bei nachfolgenden Ausführungen werden in Dataform nur gemäß den von Ihnen konfigurierten Bedingungen neue Zeilen eingefügt oder in die inkrementelle Tabelle zusammengeführt.
Dataform fügt neue Zeilen nur in Spalten ein, die bereits in der inkrementellen Tabelle vorhanden sind. Wenn Sie Änderungen an der Abfrage für eine inkrementelle Tabellendefinition vornehmen, z. B. eine neue Spalte hinzufügen, müssen Sie die Tabelle neu erstellen. Wählen Sie dazu beim nächsten Auslösen der Tabelle die Option Mit vollständiger Aktualisierung ausführen aus.
Hier sind einige häufige Anwendungsfälle für inkrementelle Tabellen:
Leistungsoptimierung
Bei einigen Arten von Daten wie Webanwendungs- oder Analysedaten kann es sinnvoll sein, nur neue Datensätze zu verarbeiten, anstatt die gesamte Tabelle noch einmal zu verarbeiten.
Latenzreduzierung
Mit inkrementellen Tabellen können Sie Workflows schnell, aber häufig ausführen, wodurch die nachgelagerte Latenz der Ausgabetabellen reduziert wird.
Tägliche Snapshots
Sie können eine inkrementelle Tabelle so konfigurieren, dass tägliche Snapshots der Tabellendaten erstellt werden, beispielsweise für die Langzeitanalyse der in einer Produktionsdatenbank gespeicherten Nutzereinstellungen.
Hinweise
Rufen Sie in der Cloud Console die Seite Dataform auf.
Wählen Sie ein Repository aus oder erstellen Sie ein Repository.
Wählen Sie einen Entwicklungsarbeitsbereich aus oder erstellen Sie einen.
Erstellen Sie eine Tabelle des Tabellentyps
incremental
.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Dataform-Bearbeiter (roles/dataform.editor
) für Arbeitsbereiche zu gewähren, um die Berechtigungen zu erhalten, die Sie zum Konfigurieren einer inkrementellen Tabelle benötigen.
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.
Möglicherweise können Sie die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen anfordern.
Eine Teilmenge der Zeilen in einer inkrementellen Tabelle verarbeiten
Wenn Sie eine Teilmenge der Zeilen festlegen möchten, die bei jeder Ausführung von Dataform verarbeitet werden sollen, fügen Sie der inkrementellen SQLX-Definitionsdatei der inkrementellen Tabelle eine bedingte WHERE
-Klausel hinzu.
So konfigurieren Sie eine inkrementelle Tabelle:
- Rufen Sie den Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien den Bereich
definitions/
. - Öffnen Sie eine SQLX-Datei mit inkrementeller Tabellendefinition.
- Geben Sie eine
WHERE
-Klausel im folgenden Format ein:
config { type: "incremental" }
SELECT_STATEMENT
${when(incremental(), `WHERE CONDITION FROM ${self()}`) }
- Ersetzen Sie SELECT_STATEMENT durch die
SELECT
-Anweisung, mit der die Tabelle definiert wird. - Ersetzen Sie CONDITION durch Ihre Bedingung für die Klausel
WHERE
, mit der Zeilen ausgewählt werden, die Dataform während der Tabellenausführung verarbeiten soll.
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, die Zeilen der Tabelle productiondb.logs
inkrementell verarbeitet:
config { type: "incremental" }
SELECT timestamp, message FROM ${ref("productiondb", "logs")}
${when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, die einen Snapshot der Tabelle productiondb.customers
erstellt:
config { type: "incremental" }
SELECT CURRENT_DATE() AS snapshot_date, customer_id, name, account_settings FROM ${ref("productiondb", "customers")}
${when(incremental(), `WHERE snapshot_date > (SELECT MAX(snapshot_date) FROM ${self()})`) }
Zeilen in einer inkrementellen Tabelle zusammenführen
Wenn eine inkrementelle Tabelle nur eine Zeile enthalten soll, die einer ausgewählten Kombination von Spalten entspricht, legen Sie die ausgewählten Spalten als uniqueKey
fest, um Zeilen mit derselben uniqueKey
zusammenzuführen. Wenn Sie die Tabelle aktualisieren, werden die Zeilen in Dataform mit uniqueKey
zusammengeführt, anstatt sie anzuhängen.
So konfigurieren Sie die Zusammenführung in einer inkrementellen Tabelle:
- Rufen Sie den Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien den Bereich
definitions/
. - SQLX-Datei für inkrementelle Tabellendefinition auswählen
- Legen Sie im Block
config
die ausgewählten Spalten alsuniqueKey
im folgenden Format fest:
uniqueKey: ["COLUMN_NAME"]
Ersetzen Sie COLUMN_NAME durch den Namen einer ausgewählten Spalte.
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle mit der uniqueKey
-Spalte, sodass transaction_id
immer eine Zeile enthält:
config {
type: "incremental",
uniqueKey: ["transaction_id"]
}
SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }
Zeilen in einer inkrementellen Tabelle filtern
Damit in einer inkrementellen partitionierten Tabelle in Dataform die gesamte Tabelle nicht nach übereinstimmenden Zeilen durchsucht wird, legen Sie fest, dass updatePartitionFilter
nur einen Teil der Datensätze berücksichtigt.
Das folgende Codebeispiel zeigt eine inkrementelle partitionierte Tabelle mit zusammengeführten Werten, die durch Festlegen der Attribute uniqueKey
und updatePartitionFilter
konfiguriert wird:
config {
type: "incremental",
uniqueKey: ["transaction_id"],
bigquery: {
partitionBy: "DATE(timestamp)",
updatePartitionFilter:
"timestamp >= timestamp_sub(current_timestamp(), interval 24 hour)"
}
}
SELECT timestamp, action FROM weblogs.user_actions
${ when(incremental(), `WHERE timestamp > (SELECT MAX(timestamp) FROM ${self()})`) }
Bei einer Aufnahme aus einer partitionierten Tabelle vollständige Tabellenscans vermeiden
Wenn Sie eine inkrementelle Tabelle erstellen, die auf eine partitionierte Tabelle verweist, empfehlen wir, eine Tabellenabfrage zu erstellen, um vollständige Tabellenscans der partitionierten Tabelle bei jeder inkrementellen Aktualisierung zu vermeiden.
Sie können die Anzahl der Partitionen beschränken, die von BigQuery gescannt werden, um die inkrementelle Tabelle zu aktualisieren. Verwenden Sie dazu einen konstanten Ausdruck in der Tabellenabfrage. Wenn Sie einen Wert aus der partitionierten Tabelle in einen konstanten Ausdruck umwandeln möchten, verwenden Sie BigQuery-Skript, um den Wert als Variable im pre_operations
-Block zu deklarieren.
Verwenden Sie die Variable dann als konstanten Ausdruck in einer WHERE
-Klausel in der SELECT
-Abfrage.
Bei dieser Konfiguration aktualisiert Dataform die inkrementelle Tabelle anhand der letzten Partitionen der referenzierten partitionierten Tabelle, ohne die gesamte Tabelle zu scannen.
So konfigurieren Sie eine inkrementelle Tabelle, die auf eine partitionierte Tabelle verweist, und vermeiden vollständige Scans:
- Rufen Sie den Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien den Bereich
definitions/
. - SQLX-Datei für inkrementelle Tabellendefinition auswählen
- Geben Sie im
pre_operations
-Block eine Variable mit BigQuery-Skript an. - Filtern Sie die Anweisung
SELECT
, die die Tabelle definiert, mit einerWHERE
-Klausel, die auf die deklarierte Variable verweist.
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, in der die referenzierte Tabelle raw_events
nach event_timestamp
partitioniert ist:
config {
type: "incremental",
}
pre_operations {
DECLARE event_timestamp_checkpoint DEFAULT (
${when(incremental(),
`SELECT max(event_timestamp) FROM ${self()}`,
`SELECT timestamp("2000-01-01")`)}
)
}
SELECT
*
FROM
${ref("raw_events")}
WHERE event_timestamp > event_timestamp_checkpoint
Im vorherigen Codebeispiel ist die Variable event_timestamp_checkpoint
im pre_operations
-Block definiert.
Die Variable event_timestamp_checkpoint
wird dann als konstanter Ausdruck in der WHERE
-Klausel verwendet.
Inkrementelle Tabelle von Grund auf neu erstellen
Sie können die Neuerstellung einer inkrementellen Tabelle mit der Option Befehlszeile mit der Option --full-refresh
oder mit der Option Mit vollständiger Aktualisierung ausführen, wenn Sie eine Workflowausführung auslösen, von Grund auf neu erstellen.
Wenn Sie die Option zur vollständigen Aktualisierung im Entwicklungsarbeitsbereich oder mit der Dataform-Befehlszeile auswählen, ignoriert Dataform den Parameter ${when(incremental(), ... }
während der Ausführung und erstellt die Tabelle mit einer CREATE OR REPLACE
-Anweisung neu.
Inkrementelle Tabelle vor vollständiger Aktualisierung schützen
Um zu verhindern, dass eine inkrementelle Tabelle von Grund auf neu erstellt wird und möglicherweise Datenverluste auftreten, können Sie die inkrementelle Tabelle als protected
festlegen. Sie können verhindern, dass eine inkrementelle Tabelle neu erstellt wird, wenn Ihre Datenquelle temporär ist.
So markieren Sie eine inkrementelle Tabelle als protected
:
- Rufen Sie den Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien den Bereich
definitions/
. - Wählen Sie eine SQLX-Datei mit inkrementeller Tabellendefinition aus.
- Geben Sie im Block
config
protected: true
ein.
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, die als protected
gekennzeichnet ist:
config {
type: "incremental",
protected: true
}
SELECT ...
Nächste Schritte
- Informationen zum Definieren einer Tabelle finden Sie unter Tabelle erstellen.
- Informationen zum Verwenden der Dataform-Befehlszeile finden Sie unter Dataform-Befehlszeile verwenden.
- Informationen zum manuellen Auslösen von Ausführungen finden Sie unter Triggerausführung.