Informationen zu einer inkrementellen Tabelle
Dataform aktualisiert Tabellen je nach Tabellentyp unterschiedlich. Bei jeder Ausführung einer Tabelle oder Ansicht erstellt Dataform die gesamte Tabelle oder Ansicht von Grund auf neu.
Wenn Sie eine inkrementelle Tabelle definieren, erstellt Dataform die inkrementelle Tabelle nur zum ersten Mal von Grund auf neu. Bei nachfolgenden Ausführungen fügt Dataform neue Zeilen nur entsprechend den von Ihnen konfigurierten Bedingungen in die inkrementelle Tabelle ein oder führt sie zusammen.
Dataform fügt neue Zeilen nur in Spalten ein, die bereits in der inkrementellen Tabelle vorhanden sind. Wenn Sie Änderungen an der Abfrage der inkrementellen Tabellendefinition vornehmen und beispielsweise eine neue Spalte hinzufügen, müssen Sie die Tabelle von Grund auf neu erstellen. Wählen Sie dazu die Option Mit vollständiger Aktualisierung ausführen aus, wenn Sie das nächste Mal eine Ausführung der Tabelle auslösen.
Hier sind einige häufige Anwendungsfälle für inkrementelle Tabellen:
- Leistungsoptimierung
- Bei einigen Arten von Daten, z. B. Webprotokollen oder Analysedaten, ist es unter Umständen sinnvoll, nur neue Datensätze zu verarbeiten, anstatt die gesamte Tabelle noch einmal zu verarbeiten.
- Latenzreduzierung
- Sie können Workflows mithilfe von inkrementellen Tabellen schnell, aber häufig ausführen, um die Downstream-Latenz der Ausgabetabellen zu reduzieren.
- Tägliche Snapshots
- Sie können eine inkrementelle Tabelle konfigurieren, um tägliche Snapshots der Tabellendaten zu erstellen, z. B. für eine Längsschnittanalyse von Nutzereinstellungen, die in einer Produktionsdatenbank gespeichert sind.
Hinweise
Öffnen Sie in der Google Cloud Console die Seite Dataform.
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 für Arbeitsbereiche die IAM-Rolle Dataform Editor (roles/dataform.editor
) zu gewähren, damit Sie die Berechtigungen 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 erhalten.
Teilmenge von Zeilen in einer inkrementellen Tabelle verarbeiten
Um eine Teilmenge der Zeilen zu bestimmen, die Dataform bei jeder Ausführung verarbeiten soll, fügen Sie der SQLX-Definitionsdatei der inkrementellen Tabelle eine bedingte WHERE
-Klausel hinzu. In der WHERE
-Klausel können Sie eine inkrementelle und eine nicht-inkrementelle Bedingung angeben.
Dataform wendet die inkrementelle Bedingung während der Tabellenausführung ohne vollständige Aktualisierung und die nicht inkrementelle Bedingung während der Ausführung mit einer vollständigen Aktualisierung an.
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 INCREMENTAL_CONDITION`, `WHERE NON_INCREMENTAL_CONDITION`) }
Ersetzen Sie Folgendes:
- SELECT_STATEMENT: Die
SELECT
-Anweisung, mit der Ihre Tabelle definiert wird INCREMENTAL_CONDITION: Die Bedingung, die Sie in der
WHERE
-Klausel angeben, um Zeilen auszuwählen, die Dataform während der Tabellenausführung ohne vollständige Aktualisierung verarbeiten soll.NON_INCREMENTAL_CONDITION: Die Bedingung, die Sie in der
WHERE
-Klausel angeben, um Zeilen auszuwählen, die Dataform während der Tabellenausführung mit vollständiger Aktualisierung verarbeiten soll.
- SELECT_STATEMENT: Die
Optional: Klicken Sie auf Format.
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 date > (SELECT MAX(date) FROM ${self()}) AND country = "UK"`,
`WHERE country = "UK"`)}
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
Damit eine inkrementelle Tabelle nur eine Zeile enthält, die einer ausgewählten Spaltenkombination entspricht, legen Sie die ausgewählten Spalten als uniqueKey
fest, um Zeilen mit derselben uniqueKey
zusammenzuführen. Beim Aktualisieren der Tabelle führt Dataform Zeilen mit uniqueKey
zusammen, 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 mit inkrementeller 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 der ausgewählten Spalte.
Optional: Klicken Sie auf Format.
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, in der die Spalte transaction_id
auf uniqueKey
festgelegt ist, um sicherzustellen, dass sie 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 Dataform in einer inkrementellen partitionierten Tabelle nicht die gesamte Tabelle nach übereinstimmenden Zeilen durchsucht, legen Sie updatePartitionFilter
so fest, dass nur eine Teilmenge der Datensätze berücksichtigt wird.
Das folgende Codebeispiel zeigt eine inkrementell partitionierte Tabelle mit Zusammenführung, die durch Festlegen der Attribute uniqueKey
und updatePartitionFilter
konfiguriert wurde:
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()})`) }
Vollständige Tabellenscans bei der Aufnahme aus einer partitionierten Tabelle vermeiden
Wenn Sie eine inkrementelle Tabelle erstellen, die auf eine partitionierte Tabelle verweist, sollten Sie eine Tabellenabfrage erstellen, um bei jeder inkrementellen Aktualisierung vollständige Tabellenscans der partitionierten Tabelle zu vermeiden.
Sie können die Anzahl der Partitionen begrenzen, die BigQuery scannt, um die inkrementelle Tabelle zu aktualisieren, indem Sie einen konstanten Ausdruck in Ihrer Tabellenabfrage verwenden. Wenn Sie einen Wert aus der partitionierten Tabelle in einen konstanten Ausdruck umwandeln möchten, verwenden Sie die BigQuery-Skripterstellung, um den Wert als Variable im Block pre_operations
anzugeben.
Verwenden Sie die Variable dann als konstanten Ausdruck in einer WHERE
-Klausel in der SELECT
-Abfrage.
Mit dieser Konfiguration aktualisiert Dataform die inkrementelle Tabelle basierend auf den neuesten Partitionen der referenzierten partitionierten Tabelle, ohne die gesamte Tabelle zu scannen.
So konfigurieren Sie eine inkrementelle Tabelle, die auf eine partitionierte Tabelle verweist und vollständige Tabellenscans vermeidet:
- Rufen Sie den Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien den Bereich
definitions/
. - SQLX-Datei mit inkrementeller Tabellendefinition auswählen
- Im Block
pre_operations
deklarieren Sie eine Variable mit BigQuery-Skripts. - Filtern Sie die
SELECT
-Anweisung, die die Tabelle definiert, mit einerWHERE
-Klausel, die auf die deklarierte Variable verweist. - Optional: Klicken Sie auf Format.
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 Block pre_operations
definiert.
Die Variable event_timestamp_checkpoint
wird dann als konstanter Ausdruck in der WHERE
-Klausel verwendet.
Inkrementelle Tabelle von Grund auf neu mit vollständiger Aktualisierung neu erstellen
Sie können erzwingen, dass eine inkrementelle Tabelle von Grund auf neu erstellt wird. Verwenden Sie dazu entweder die Befehlszeile mit der Option --full-refresh
oder die Option Mit vollständiger Aktualisierung ausführen, wenn Sie eine Workflowausführung auslösen.
Wenn Sie im Entwicklungsarbeitsbereich oder über die Dataform CLI die Option zur vollständigen Aktualisierung 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 Datenverluste auftreten können, können Sie sie als protected
festlegen. Möglicherweise möchten Sie 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
den Wertprotected: true
ein. - Optional: Klicken Sie auf Format.
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 zur Verwendung der Dataform-Befehlszeile finden Sie unter Dataform-Befehlszeile verwenden.
- Informationen zum manuellen Auslösen von Ausführungen finden Sie unter Ausführung auslösen.