Inkrementelle Tabelle konfigurieren

In diesem Dokument wird beschrieben, wie Sie den Dataform Core zum Konfigurieren einer inkrementellen Tabelle verwenden.

Eine inkrementelle Tabelle

Dataform aktualisiert Tabellen je nach Tabellentyp unterschiedlich. Bei jeder Ausführung einer Tabelle oder Ansicht erstellt Dataform die gesamte Tabelle oder Ansicht neu.

Wenn Sie eine inkrementelle Tabelle definieren, erstellt Dataform diese Tabelle zum ersten Mal von Grund auf neu. Bei nachfolgenden Ausführungen werden in Dataform nur gemäß den von Ihnen konfigurierten Bedingungen neue Zeilen eingefügt oder in die inkrementelle Tabelle 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 eine inkrementelle Tabellendefinition vornehmen, z. B. eine neue Spalte hinzufügen, müssen Sie die Tabelle neu erstellen. Wählen Sie dazu beim nächsten Auslösen der Tabelle die Option Mit vollständiger Aktualisierung ausführen aus.

Hier sind einige häufige Anwendungsfälle für inkrementelle Tabellen:

  • Leistungsoptimierung

    Bei einigen Arten von Daten wie Webanwendungs- oder Analysedaten kann es sinnvoll sein, nur neue Datensätze zu verarbeiten, anstatt die gesamte Tabelle noch einmal zu verarbeiten.

  • Latenzreduzierung

    Mit inkrementellen Tabellen können Sie Workflows schnell, aber häufig ausführen, wodurch die nachgelagerte Latenz der Ausgabetabellen reduziert wird.

  • Tägliche Snapshots

    Sie können eine inkrementelle Tabelle so konfigurieren, dass tägliche Snapshots der Tabellendaten erstellt werden, beispielsweise für die Langzeitanalyse der in einer Produktionsdatenbank gespeicherten Nutzereinstellungen.

Hinweise

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

    Zur Dataform-Seite

  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-Bearbeiter (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 anfordern.

Eine Teilmenge der Zeilen in einer inkrementellen Tabelle verarbeiten

Wenn Sie eine Teilmenge der Zeilen festlegen möchten, die bei jeder Ausführung von Dataform verarbeitet werden sollen, fügen Sie der inkrementellen 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 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 CONDITION FROM ${self()}`) }
  1. Ersetzen Sie SELECT_STATEMENT durch die SELECT-Anweisung, mit der die Tabelle definiert wird.
  2. Ersetzen Sie CONDITION durch Ihre Bedingung für die Klausel WHERE, mit der Zeilen ausgewählt werden, die Dataform während der Tabellenausführung verarbeiten soll.

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

Wenn eine inkrementelle Tabelle nur eine Zeile enthalten soll, die einer ausgewählten Kombination von Spalten entspricht, legen Sie die ausgewählten Spalten als uniqueKey fest, um Zeilen mit derselben uniqueKey zusammenzuführen. Wenn Sie die Tabelle aktualisieren, werden die Zeilen in Dataform mit uniqueKey zusammengeführt, 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 für inkrementelle 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.

Das folgende Codebeispiel zeigt eine inkrementelle Tabelle mit der uniqueKey-Spalte, sodass transaction_id 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 in einer inkrementellen partitionierten Tabelle in Dataform die gesamte Tabelle nicht nach übereinstimmenden Zeilen durchsucht wird, legen Sie fest, dass updatePartitionFilter nur einen Teil der Datensätze berücksichtigt.

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

Bei einer Aufnahme aus einer partitionierten Tabelle vollständige Tabellenscans vermeiden

Wenn Sie eine inkrementelle Tabelle erstellen, die auf eine partitionierte Tabelle verweist, empfehlen wir, eine Tabellenabfrage zu erstellen, um vollständige Tabellenscans der partitionierten Tabelle bei jeder inkrementellen Aktualisierung zu vermeiden.

Sie können die Anzahl der Partitionen beschränken, die von BigQuery gescannt werden, 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, verwenden Sie BigQuery-Skript, um den Wert als Variable im pre_operations-Block zu deklarieren. 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 letzten Partitionen der referenzierten partitionierten Tabelle, ohne die gesamte Tabelle zu scannen.

So konfigurieren Sie eine inkrementelle Tabelle, die auf eine partitionierte Tabelle verweist, und vermeiden vollständige Scans:

  1. Rufen Sie den Entwicklungsarbeitsbereich auf.
  2. Maximieren Sie im Bereich Dateien den Bereich definitions/.
  3. SQLX-Datei für inkrementelle Tabellendefinition auswählen
  4. Geben Sie im pre_operations-Block eine Variable mit BigQuery-Skript an.
  5. Filtern Sie die Anweisung SELECT, die die Tabelle definiert, mit einer WHERE-Klausel, die auf die deklarierte Variable verweist.

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

Sie können die Neuerstellung einer inkrementellen Tabelle mit der Option Befehlszeile mit der Option --full-refresh oder mit der Option Mit vollständiger Aktualisierung ausführen, wenn Sie eine Workflowausführung auslösen, von Grund auf neu erstellen.

Wenn Sie die Option zur vollständigen Aktualisierung im Entwicklungsarbeitsbereich oder mit der 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

Um zu verhindern, dass eine inkrementelle Tabelle von Grund auf neu erstellt wird und möglicherweise Datenverluste auftreten, können Sie die inkrementelle Tabelle als protected festlegen. Sie können 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 protected: true ein.

Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, die als protected gekennzeichnet ist:

config {
  type: "incremental",
  protected: true
}
SELECT ...

Nächste Schritte