Inkrementelle Tabelle konfigurieren

In diesem Dokument erfahren Sie, wie Sie Dataform Core zum Konfigurieren eines inkrementelle Tabelle.

Informationen zu einer inkrementellen Tabelle

Dataform aktualisiert Tabellen je nach Tabellentyp unterschiedlich. Währenddessen einer Tabelle oder Ansicht durchgeführt wird, erstellt Dataform das gesamte Tabelle oder Ansicht komplett neu erstellen.

Wenn Sie eine inkrementelle Tabelle definieren, erstellt Dataform die inkrementellen Tabelle komplett neu erstellen. Bei nachfolgenden Ausführungen Dataform fügt nur neue Zeilen in die inkrementelle Tabelle ein oder führt sie zusammen. gemäß den von Ihnen konfigurierten Bedingungen.

Dataform fügt neue Zeilen nur in Spalten ein, die bereits in der inkrementelle Tabelle. Wenn Sie Änderungen an der Definition der inkrementellen Tabelle vornehmen Abfrage hinzu (z. B. eine neue Spalte hinzufügen), müssen Sie die Tabelle von Grund auf neu erstellen. Wenn Sie das nächste Mal eine Ausführung der Tabelle auslösen, wählen Sie die Option Mit vollständiger Aktualisierung ausführen aus.

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

Leistungsoptimierung
Für einige Arten von Daten, z. B. Webprotokolle oder Analysedaten, um nur neue Einträge zu verarbeiten, anstatt die gesamte Tabelle noch einmal zu verarbeiten.
Latenzreduzierung
Mit inkrementellen Tabellen lassen sich Workflows schnell, aber häufig ausführen. die Downstream-Latenz der Ausgabetabellen reduzieren.
Tägliche Snapshots
Sie können eine inkrementelle Tabelle konfigurieren, um tägliche Snapshots der Tabellendaten, z. B. zur Längsschnittanalyse gespeicherter Nutzereinstellungen in einer Produktionsdatenbank.

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 mit den incremental Tabellentyp.

Erforderliche Rollen

Um die Berechtigungen zu erhalten, die Sie zum Konfigurieren einer inkrementellen Tabelle benötigen, bitten Sie Ihren Administrator, Ihnen IAM-Rolle Dataform Editor (roles/dataform.editor) für Arbeitsbereiche. Weitere Informationen zum Zuweisen von Rollen finden Sie unter Zugriff verwalten.

Sie können die erforderlichen Berechtigungen auch über benutzerdefinierte Rollen oder andere vordefinierte Rollen erhalten.

Teilmenge von Zeilen in einer inkrementellen Tabelle verarbeiten

Um eine Teilmenge von Zeilen zu bestimmen, die Dataform während jedes Ausführung einer bedingten WHERE-Klausel zu SQLX der inkrementellen Tabelle hinzufügen Definitionsdatei. 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 an ohne vollständige Aktualisierung und die nicht-inkrementelle Bedingung während der Ausführung mit einer vollständigen Auffrischung.

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, die definiert Ihre Tabelle
    • INCREMENTAL_CONDITION: Die Bedingung, die Sie in WHERE angeben. Klausel zur Auswahl von Zeilen, die Dataform während der Tabellenausführung verarbeiten soll ohne vollständige Aktualisierung.

    • NON_INCREMENTAL_CONDITION: Die Bedingung, die Sie in der WHERE-Klausel, um Zeilen auszuwählen, die Dataform während der Tabelle verarbeiten soll Ausführung mit einer vollständigen Aktualisierung.

  5. Optional: Klicken Sie auf Format.

Das folgende Codebeispiel zeigt eine inkrementelle Tabelle, die inkrementell verarbeitet Zeilen der Tabelle productiondb.logs:

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 erstellt der Tabelle productiondb.customers:

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

Um sicherzustellen, dass eine inkrementelle Tabelle nur eine Zeile enthält, die einer Ausgewählte Spaltenkombination, ausgewählte Spalten als uniqueKey festlegen auf Zeilen mit demselben uniqueKey zusammenführen. Wenn Sie die Tabelle aktualisieren, Dataform führt 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 fest. im folgenden Format:

    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 mit dem transaction_id Spalte, die 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

Um in einer inkrementellen partitionierten Tabelle zu vermeiden, dass Dataform den in der gesamten Tabelle, um übereinstimmende Zeilen zu finden, legen Sie für updatePartitionFilter fest, dass nur Teilmenge von Datensätzen.

Das folgende Codebeispiel zeigt eine inkrementell partitionierte Tabelle mit Zusammenführung konfiguriert, indem die Attribute uniqueKey und updatePartitionFilter festgelegt wurden:

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 von die partitionierte Tabelle bei jeder inkrementellen Aktualisierung.

Sie können die Anzahl der Partitionen begrenzen, die BigQuery zum Aktualisieren scannt der inkrementellen Tabelle mithilfe eines konstanten Ausdrucks in der Tabellenabfrage. Einen Wert aus der partitionierten Tabelle in eine Konstante umwandeln können Sie mit BigQuery-Skripts Deklarieren Sie den Wert als Variable im Block pre_operations. Verwenden Sie die Variable dann als konstanten Ausdruck in einer WHERE-Klausel in Die SELECT-Abfrage.

Mit dieser Konfiguration aktualisiert Dataform die inkrementelle tabellenbasierte für die letzten Partitionen der partitionierten Tabelle, auf die verwiesen wird, ohne die gesamte Tabelle zu scannen.

Inkrementelle Tabelle konfigurieren, die auf eine partitionierte Tabelle verweist und vermeidet vollständige Tabellenscans:

  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 pre_operations-Block eine Variable mit BigQuery-Scripting deklarieren.
  5. Die SELECT-Anweisung filtern, 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 verwendet wird. Die Tabelle raw_events ist nach event_timestamp partitioniert:

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 die im pre_operations-Block definiert sind. Die Variable event_timestamp_checkpoint wird dann als konstanter Ausdruck verwendet. in der WHERE-Klausel.

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, indem Sie entweder Befehlszeilenschnittstelle mit der Option --full-refresh oder mit der Option Mit vollständiger Aktualisierung ausführen, eine Workflowausführung auslösen.

Wenn Sie die Option „Vollständige Aktualisierung“ auswählen, können Sie dies im Entwicklungsarbeitsbereich oder über über die Dataform-Befehlszeile ignoriert Dataform die ${when(incremental(), ... } während der Ausführung den Parameter mit einer CREATE OR REPLACE-Anweisung.

Inkrementelle Tabelle vor vollständiger Aktualisierung schützen

Um zu verhindern, dass eine inkrementelle Tabelle von Grund auf neu erstellt wird, Datenverlust erfassen, können Sie die inkrementelle Tabelle als protected festlegen. Vielleicht 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