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 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

  1. Öffnen Sie in der Google Cloud Console die Seite Dataform.

    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 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:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien den Bereich definitions/.
  3. Öffnen Sie eine SQLX-Datei mit inkrementeller Tabellendefinition.
  4. 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.

  5. 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:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien den Bereich definitions/.
  3. SQLX-Datei mit inkrementeller Tabellendefinition auswählen
  4. Legen Sie im Block config die ausgewählten Spalten als uniqueKey im folgenden Format fest:

    uniqueKey: ["COLUMN_NAME"]
    

    Ersetzen Sie COLUMN_NAME durch den Namen der 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, 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:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien den Bereich definitions/.
  3. SQLX-Datei mit inkrementeller Tabellendefinition auswählen
  4. Im Block pre_operations deklarieren Sie eine Variable mit BigQuery-Skripts.
  5. Filtern Sie die SELECT-Anweisung, die die Tabelle definiert, mit einer WHERE-Klausel, 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 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:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien den Bereich definitions/.
  3. Wählen Sie eine SQLX-Datei mit inkrementeller Tabellendefinition 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