Inkrementelle Tabellen
Je nach Tabellentyp werden Tabellen in Dataform unterschiedlich aktualisiert. Bei jeder Ausführung einer Tabelle oder Ansicht erstellt Dataform die gesamte Tabelle oder Ansicht neu.
Wenn Sie eine inkrementelle Tabelle definieren, wird sie in Dataform nur beim ersten Mal neu erstellt. Bei nachfolgenden Ausführungen fügt Dataform nur dann neue Zeilen in die Inkrementtabelle ein oder fügt sie zusammen, wenn die von Ihnen konfigurierten Bedingungen erfüllt sind.
Mit Dataform werden neue Zeilen nur in Spalten eingefügt, die bereits in der inkrementellen Tabelle vorhanden sind. Wenn Sie Änderungen an der Abfrage zur Definition der inkrementellen Tabelle vornehmen, z. B. eine neue Spalte hinzufügen, müssen Sie die Tabelle neu erstellen. Wählen Sie dazu beim nächsten Ausführen der Tabelle die Option Mit vollständiger Aktualisierung ausführen aus.
Hier sind einige gängige Anwendungsfälle für inkrementelle Tabellen:
- Leistungsoptimierung
- Bei einigen Datentypen, z. B. Webprotokollen oder Analysedaten, möchten Sie möglicherweise nur neue Einträge verarbeiten, anstatt die gesamte Tabelle noch einmal zu verarbeiten.
- Latenzreduzierung
- Mit inkrementellen Tabellen können Sie Workflows schnell, aber häufig ausführen und so die Downstream-Latenz der Ausgabetabellen verringern.
- Tägliche Snapshots
- Sie können eine inkrementelle Tabelle so konfigurieren, dass tägliche Snapshots der Tabellendaten erstellt werden, z. B. für eine Längsschnittanalyse der Nutzereinstellungen, die in einer Produktionsdatenbank gespeichert sind.
Hinweis
Öffnen Sie in der Google Cloud Console die Seite Dataform.
Wählen Sie ein Repository aus oder erstellen Sie ein neues.
Wählen Sie einen Entwicklungsarbeitsbereich aus oder erstellen Sie einen.
Erstellen Sie eine Tabelle vom Typ
incremental
.
Erforderliche Rollen
Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Dataform Editor (roles/dataform.editor
) für Arbeitsbereiche zuzuweisen, damit Sie die Berechtigungen erhalten, die Sie zum Konfigurieren einer inkrementellen Tabelle benötigen.
Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff auf Projekte, Ordner und Organisationen verwalten.
Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.
Teilmenge der Zeilen in einer inkrementellen Tabelle verarbeiten
Wenn Sie festlegen möchten, welche Zeilen bei jeder Ausführung von Dataform verarbeitet werden sollen, 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.
In Dataform wird die Inkrementelle Bedingung bei der Tabellenausführung ohne vollständige Aktualisierung und die Nichtinkrementelle Bedingung bei der Ausführung mit vollständiger Aktualisierung angewendet.
So konfigurieren Sie eine inkrementelle Tabelle:
- Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien
definitions/
. - Öffnen Sie eine SQLX-Datei mit einer inkrementellen 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, die die Tabelle definiert INCREMENTAL_CONDITION: Die Bedingung, die Sie in der
WHERE
-Klausel angeben, um Zeilen für die Verarbeitung durch Dataform während der Tabellenausführung ohne vollständige Aktualisierung auszuwählen.NON_INCREMENTAL_CONDITION: Die Bedingung, die Sie in der
WHERE
-Klausel angeben, um Zeilen für die Verarbeitung durch Dataform während der Tabellenausführung mit einer vollständigen Aktualisierung auszuwählen.
- SELECT_STATEMENT: Die
Optional: Klicken Sie auf Formatieren.
Das folgende Codebeispiel zeigt eine Inkrementtabelle, in der Zeilen der Tabelle productiondb.logs
inkrementell verarbeitet werden:
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, mit der ein Snapshot der Tabelle productiondb.customers
erstellt wird:
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 Kombination von Spalten entspricht, legen Sie die ausgewählten Spalten als uniqueKey
fest, um Zeilen mit demselben uniqueKey
zusammenzuführen. Beim Aktualisieren der Tabelle werden Zeilen mit uniqueKey
zusammengeführt, anstatt sie anzuhängen.
So konfigurieren Sie das Zusammenführen in einer inkrementellen Tabelle:
- Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien
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 einer ausgewählten Spalte.
Optional: Klicken Sie auf Formatieren.
Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, bei der die Spalte transaction_id
auf uniqueKey
festgelegt ist, damit 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
Wenn Sie in einer inkrementell partitionierten Tabelle verhindern möchten, dass Dataform die gesamte Tabelle nach übereinstimmenden Zeilen durchsucht, legen Sie mit updatePartitionFilter
fest, dass nur ein Teil der Datensätze berücksichtigt werden soll.
Das folgende Codebeispiel zeigt eine inkrementell partitionierte Tabelle mit Zusammenführen, die durch Festlegen der Eigenschaften 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 beim Aufnehmen aus einer partitionierten Tabelle vermeiden
Wenn Sie eine inkrementelle Tabelle erstellen, die auf eine partitionierte Tabelle verweist, sollten Sie Ihre Tabellenabfrage so erstellen, dass bei jeder inkrementellen Aktualisierung keine vollständigen Tabellenscans der partitionierten Tabelle ausgeführt werden.
Sie können die Anzahl der Partitionen begrenzen, die BigQuery zum Aktualisieren der inkrementellen Tabelle scannt. Verwenden Sie dazu einen konstanten Ausdruck in Ihrer Tabellenabfrage. Wenn Sie einen Wert aus der partitionierten Tabelle in einen konstanten Ausdruck umwandeln möchten, deklarieren Sie den Wert mit BigQuery-Scripting als Variable im Block pre_operations
.
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 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 verhindert:
- Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien
definitions/
. - SQLX-Datei mit inkrementeller Tabellendefinition auswählen
- Deklarieren Sie im Block
pre_operations
eine Variable mit BigQuery-Scripting. - Filtern Sie die
SELECT
-Anweisung, die die Tabelle definiert, mit einerWHERE
-Klausel, die auf die deklarierte Variable verweist. - Optional: Klicken Sie auf Formatieren.
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 mit vollständiger Aktualisierung neu erstellen
Sie können eine inkrementelle Tabelle entweder über die Befehlszeile mit der Option --full-refresh
oder über die Option Mit vollständiger Aktualisierung ausführen neu erstellen, wenn Sie eine Workflowausführung auslösen.
Wenn Sie die Option „Vollständige Aktualisierung“ in Ihrem Entwicklungsbereich oder über die 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
Wenn Sie eine inkrementelle Tabelle vor dem Neuaufbau und potenziellen Datenverlusten schützen möchten, können Sie sie als protected
festlegen. Wenn Ihre Datenquelle temporär ist, können Sie verhindern, dass eine inkrementelle Tabelle neu erstellt wird.
So kennzeichnen Sie eine inkrementelle Tabelle als protected
:
- Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
- Maximieren Sie im Bereich Dateien
definitions/
. - Wählen Sie eine SQLX-Datei mit einer inkrementellen Tabellendefinition aus.
- Geben Sie im Block
config
den Wertprotected: true
ein. - Optional: Klicken Sie auf Formatieren.
Das folgende Codebeispiel zeigt inkrementelle Tabellen, die als protected
gekennzeichnet sind:
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 Triggerausführung.