Inkrementelle Tabelle konfigurieren

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

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

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

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

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

  1. Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien definitions/.
  3. Öffnen Sie eine SQLX-Datei mit einer inkrementellen 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, 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.

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

  1. Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien 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 einer ausgewählten Spalte.

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

  1. Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien definitions/.
  3. SQLX-Datei mit inkrementeller Tabellendefinition auswählen
  4. Deklarieren Sie im Block pre_operations eine Variable mit BigQuery-Scripting.
  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 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:

  1. Rufen Sie Ihren Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien definitions/.
  3. Wählen Sie eine SQLX-Datei mit einer inkrementellen Tabellendefinition aus.
  4. Geben Sie im Block config den Wert protected: true ein.
  5. 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