Inkrementelle Tabelle konfigurieren

In diesem Dokument erfahren Sie, wie Sie mit Dataform Core eine inkrementelle Tabelle konfigurieren.

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. Bei nachfolgenden Ausführungen werden von Dataform nur gemäß den von Ihnen konfigurierten Bedingungen neue Zeilen in die inkrementelle Tabelle eingefügt oder diese 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 die inkrementelle 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 bestimmten Daten wie Webprotokollen oder Analysedaten kann es sinnvoll sein, nur neue Datensätze zu verarbeiten, anstatt die gesamte Tabelle noch einmal zu verarbeiten.
Reduzierung der Latenz
Sie können inkrementelle Tabellen verwenden, um Workflows schnell, aber häufig auszuführen, wodurch die Downstream-Latenz der Ausgabetabellen verringert wird.
Tägliche Snapshots
Sie können eine inkrementelle Tabelle konfigurieren, um tägliche Snapshots der Tabellendaten zu erstellen, z. B. für die Längsschnittanalyse von Nutzereinstellungen, die in einer Produktionsdatenbank gespeichert sind.

Hinweise

  1. Rufen Sie in der Google Cloud Console die Seite Dataform auf.

    Zur Seite „Dataform“

  2. Wählen Sie ein Repository aus oder erstellen Sie ein Repository.

  3. Wählen Sie einen Entwicklungsarbeitsbereich aus oder erstellen Sie einen.

  4. Erstellen Sie eine Tabelle des Tabellentyps incremental.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die IAM-Rolle Dataform Editor (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 erhalten.

Eine Teilmenge von Zeilen in einer inkrementellen Tabelle verarbeiten

Um eine Teilmenge von 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.

So konfigurieren Sie eine inkrementelle Tabelle:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien die Option definitions/.
  3. Öffnen Sie eine SQLX-Datei für die inkrementelle Tabellendefinition.
  4. Geben Sie eine WHERE-Klausel im folgenden Format ein:

    config { type: "incremental" }
    
    SELECT_STATEMENT
    
    ${when(incremental(), `WHERE CONDITION`) }
    

    Ersetzen Sie Folgendes:

    • SELECT_STATEMENT: Die SELECT-Anweisung, die Ihre Tabelle definiert.
    • CONDITION: Ihre Bedingung für die WHERE-Klausel, die Zeilen auswählt, die Dataform während der Tabellenausführung verarbeiten soll.
  5. Optional: Klicken Sie auf Format.

Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, die Zeilen der Tabelle productiondb.logs schrittweise 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

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:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien die Option definitions/.
  3. Wählen Sie eine inkrementelle SQLX-Tabellendefinitionsdatei aus
  4. Legen Sie im config-Block die ausgewählten Spalten als uniqueKey im folgenden Format fest:

    uniqueKey: ["COLUMN_NAME"]
    

    Ersetzen Sie COLUMN_NAME durch den Namen einer ausgewählten Spalte.

  5. Optional: Klicken Sie auf Format.

Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, in der die Spalte transaction_id auf uniqueKey festgelegt ist. Dadurch wird sichergestellt, 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 scannt, legen Sie updatePartitionFilter so fest, dass nur eine Teilmenge der Datensätze berücksichtigt wird.

Das folgende Codebeispiel zeigt eine inkrementelle partitionierte Tabelle mit Zusammenführung, 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()})`) }

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 Ihre Tabellenabfrage erstellen, um vollständige Tabellenscans der partitionierten Tabelle bei jeder inkrementellen Aktualisierung zu vermeiden.

Sie können die Anzahl der Partitionen begrenzen, die BigQuery scannt, 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, deklarieren Sie den Wert mithilfe von BigQuery-Skripts als Variable im Block pre_operations. Anschließend verwenden Sie die Variable 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 das Scannen vollständiger Tabellen vermeidet:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien die Option definitions/.
  3. Wählen Sie eine inkrementelle SQLX-Tabellendefinitionsdatei aus
  4. Im pre_operations-Block deklarieren Sie eine Variable mit BigQuery-Scripting.
  5. Filtern Sie die SELECT-Anweisung, die die Tabelle mit einer WHERE-Klausel definiert, die auf die deklarierte Variable verweist.
  6. 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 wird 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 mit vollständiger Aktualisierung 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 in Ihrem Entwicklungsarbeitsbereich oder über die Dataform-Befehlszeile die Option für eine vollständige 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 eine inkrementelle Tabelle vor der Neuerstellung und möglichen Datenverlusten zu schützen, können Sie die inkrementelle Tabelle 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:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien die Option definitions/.
  3. Wählen Sie eine inkrementelle SQLX-Tabellendefinitionsdatei aus.
  4. Geben Sie im Block config den Wert protected: true ein.
  5. 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