Daten nach Bigtable exportieren (Reverse ETL)

In diesem Dokument wird beschrieben, wie Sie einen RETL-Workflow (Reverse ETL) von BigQuery nach Bigtable einrichten. Dazu verwenden Sie die Anweisung EXPORT DATA, um Daten aus einer BigQuery-Tabelle in eine Bigtable-Tabelle zu exportieren.

BigQuery-Nutzer können einen RETL-Workflow für Bigtable einrichten, der die Analysefunktionen von BigQuery mit der niedrigen Latenz und dem hohen Durchsatz von Bigtable kombiniert. Mit diesem Workflow können Sie Daten für Anwendungsnutzer bereitstellen, ohne dabei Kontingente und Limits in BigQuery aufzubrauchen.

Eigenschaften von Bigtable-Tabellen

Bigtable-Tabellen unterscheiden sich in verschiedener Hinsicht von BigQuery-Tabellen:

  • Sowohl Bigtable- als auch BigQuery-Tabellen bestehen aus Zeilen, aber eine Bigtable-Zeile besteht aus Zeilenschlüssel- und Spaltenfamilien mit einer beliebigen Anzahl an Spalten, die zur gleichen Spaltenfamilie gehören.
  • Spaltenfamilien für eine bestimmte Tabelle werden beim Erstellen der Tabelle erstellt, können aber auch später hinzugefügt oder entfernt werden. Beim Erstellen einer Spaltenfamilie müssen keine Spalten angegeben werden, die zu ihr gehören.
  • Bigtable-Spalten müssen nicht im Voraus definiert werden und können zum Speichern von Daten in ihrem Namen (auch bekannt als Qualifier) unter Größenbeschränkungen für Daten in Tabellen verwendet werden.
  • Bigtable-Spalten können innerhalb der Größenbeschränkungen für Daten in Tabellen einen beliebigen Binärwert haben.
  • Bigtable-Spalten haben immer eine zeitliche Dimension (auch Version genannt). Es kann eine beliebige Anzahl an Werten in einer beliebigen Zeile für dieselbe Spalte gespeichert werden, solange der Zeitstempel nicht identisch ist.
  • Ein Bigtable-Zeitstempel wird in Mikrosekunden seit der Unix-Epochenzeit gemessen. 0 steht beispielsweise für 1970-01-01T00:00:00 UTC. Zeitstempel müssen eine nicht negative Anzahl von Mikrosekunden mit einer Granularität von Millisekunden sein. Es wird nur ein Vielfaches von 1.000us akzeptiert. Der standardmäßige Bigtable-Zeitstempel ist 0.
  • Daten in Bigtable werden nach Zeilenschlüssel, mehreren Zeilenschlüsseln oder Zeilenschlüsselbereich gelesen, oder mithilfe eines Filters. In allen Leseanfragen mit Ausnahme eines vollständigen Tabellenscans ist mindestens ein Zeilenschlüssel oder ein Zeilenschlüsselbereich erforderlich.

Informationen zum Vorbereiten von BigQuery-Ergebnissen für den Export nach Bigtable finden Sie unter Abfrageergebnisse für den Export vorbereiten.

Hinweise

Erteilen Sie IAM-Rollen (Identity and Access Management), die Nutzern die erforderlichen Berechtigungen zum Ausführen der einzelnen Aufgaben in diesem Dokument geben.

Erforderliche Rollen

Bitten Sie Ihren Administrator, Ihnen die folgenden IAM-Rollen für Ihr Projekt zuzuweisen, um die Berechtigungen zu erhalten, die Sie zum Exportieren von BigQuery-Daten nach Bigtable benötigen:

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.

Beschränkungen

Überlegungen zum Standort

  • Wenn sich Ihr BigQuery-Dataset in einer Multiregion befindet, muss Ihr Bigtable-Anwendungsprofil so konfiguriert sein, dass Daten an einen Bigtable-Cluster innerhalb dieser Multiregion weitergeleitet werden. Wenn sich Ihr BigQuery-Dataset zum Beispiel in der Multiregion US befindet, kann sich der Bigtable-Cluster in der Region us-west1 (Oregon) in den USA befinden.
  • Wenn sich Ihr BigQuery-Dataset in nur einer Region befindet, muss Ihr Bigtable-Anwendungsprofil zur Weiterleitung von Daten an einen Bigtable-Cluster in derselben Region konfiguriert sein. Wenn sich Ihr BigQuery-Dataset zum Beispiel in der Region asia-northeast1 (Tokio) befindet, muss sich Ihr Bigtable-Cluster ebenfalls in der Region asia-northeast1 (Tokio) befinden.

Weitere Informationen finden Sie unter Bigtable-Standorte.

Unterstützte BigQuery-Typen

Die folgenden Datentypen werden unterstützt, wenn sie in Bigtable geschrieben werden:

BigQuery-Typ Geschriebener Bigtable-Wert
BYTES Unverändert exportiert.
STRING In BYTES umgewandelt
INTEGER Wenn bigtable_options.column_families.encoding auf BINARY gesetzt ist, wird der Wert in einem 8-Byte-Big-Endian-Format geschrieben (die wichtigsten Byte zuerst). Wenn bigtable_options.column_families.encoding auf TEXT gesetzt ist, wird der Wert als menschenlesbarer String geschrieben, der eine Zahl darstellt.
FLOAT Schreibt den Wert im Ausgabeformat IEEE 754 8-Byte.
BOOLEAN Wenn bigtable_options.column_families.encoding auf BINARY gesetzt ist, wird der Wert als 1-Byte-Wert geschrieben (false = 0x00 oder true = 0x01). Wenn bigtable_options.column_families.encoding auf TEXT gesetzt ist, wird der Wert als Text geschrieben ("true" oder "false").
JSON
Eine exportierte Spalte vom Typ JSON wird als eine Gruppe von Spalten interpretiert, die zu einer bestimmten Bigtable-Spaltenfamilie gehören. Mitglieder des JSON-Objekts werden als Spalten interpretiert und ihre Werte werden in Bigtable geschrieben. Der Name der zu schreibenden Spalte kann mithilfe der bigtable_options-Konfiguration angepasst werden.

Beispiel:
    JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY
    
Dabei werden die Werte VALUE1 und VALUE2 als Spalten FIELD1 und FIELD2 in die Spaltenfamilie MY_COLUMN_FAMILY geschrieben.
STRUCT
Eine exportierte Spalte vom Typ STRUCT wird als eine Gruppe von Spalten interpretiert, die zu einer bestimmten Bigtable-Spaltenfamilie gehören. Mitglieder der Struktur werden als in Bigtable zu schreibende Spalten einschließlich ihrer Werte interpretiert. Der Name der zu schreibenden Spalte kann mithilfe der bigtable_options-Konfiguration angepasst werden.

Beispiel:
    STRUCT<FIELD1  STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY
    
Die Werte FIELD1 und FIELD2 werden dabei in Bigtable als Spalten FIELD1 und FIELD2 in die Spaltenfamilie MY_COLUMN_FAMILY geschrieben.

Diese unterstützten Datentypen ähneln dem Lesen aus externen Bigtable-Tabellen für BigQuery.

NULL-Werte in Bigtable

Für NULL-Werte in Bigtable gelten die folgenden Einschränkungen:

  • Bigtable hat kein Äquivalent für NULL-Werte. Wenn Sie einen NULL-Wert für eine bestimmte Spaltenfamilie und Spalte in Bigtable exportieren, werden die vorhandenen Werte aus einer Bigtable-Zeile gelöscht.

  • Wenn vor dem Export kein Bigtable-Wert mit einem bestimmten Zeilenschlüssel, einer Spaltenfamilie, einem Spaltenqualifizierer und einem Zeitstempel vorhanden ist, haben die exportierten NULL-Werte keine Auswirkungen auf die Bigtable-Zeile.

  • Beim Exportieren eines NULL-Werts vom Typ STRUCT oder JSON werden alle Spaltenwerte gelöscht, die zur entsprechenden Spaltenfamilie der betroffenen Zeile gehören. Sie sollten den NULL-Wert in den Typ STRUCT oder JSON umwandeln, damit die SQL-Engine einen korrekten Typ anhängen kann. Durch die folgende Abfrage werden alle Daten aus der Spaltenfamilie column_family1 mit einer Reihe von angegebenen Zeilenschlüsseln gelöscht:

    EXPORT DATA OPTIONS (...) AS
    SELECT
      rowkey,
    CAST(NULL as STRUCT) AS column_family1 FROM T
    
  • Zeilen mit NULL-Zeilenschlüsseln werden während des Exports übersprungen. Die Anzahl der übersprungenen Zeilen wird in den Exportstatistiken an den Aufrufer zurückgegeben.

Exporte mit bigtable_options konfigurieren

Sie können die bigtable_options-Konfiguration während eines Exports verwenden, um die Unterschiede zwischen den BigQuery- und Bigtable-Speichermodellen zu überbrücken. Die Konfiguration wird in Form eines JSON-Strings ausgedrückt, wie im folgenden Beispiel gezeigt:

EXPORT DATA OPTIONS(
   uri="https://bigtable.googleapis.com/projects/PROJECT_ID/instances/INSTANCE_ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
   bigtable_options = """{
     "columnFamilies": [{
       "familyId": "COLUMN_FAMILY_NAME",
       "encoding": "ENCODING_VALUE",
       "columns": [
         {
           "qualifierString": "BIGTABLE_COLUMN_QUALIFIER",
           ["qualifierEncoded": "BASE_64_ENCODED_VALUE",]
           "fieldName": "BIGQUERY_RESULT_FIELD_NAME"
         }
       ]
    }]
   }"""
)

In der folgenden Tabelle werden die möglichen Felder beschrieben, die in einer bigtable_options-Konfiguration verwendet werden:

Feldname Beschreibung
columnFamilies Ein Array von Deskriptoren für Spaltenfamilien.
columnFamilies.familyId Kennzeichnung der Bigtable-Spaltenfamilie.
columnFamilies.encoding Der Wert kann auf BINARY oder TEXT gesetzt werden. Informationen zur Codierung von Typen finden Sie unter Unterstützte BigQuery-Typen.
columnFamilies.columns Ein Array von Bigtable-Spaltenzuordnungen.
columnFamilies.columns.qualifierString Optional: Ein Bigtable-Spaltenqualifizierer. Geben Sie diesen Wert an, wenn der Spaltenqualifizierer keine Nicht-UTF-8-Codes enthält. Die Felder qualifierString und qualifierEncoding schließen sich gegenseitig aus. Wenn weder qualifierString noch qualifierEncoded angegeben ist, wird fieldName als Spaltenqualifizierer verwendet.
columnFamilies.columns.qualifierEncoded Optional: Base64-codierter Spaltenqualifizierer. Ähnlich wie qualifierString, falls der Spaltenqualifizierer Nicht-UTF-8-Codes haben muss.
columnFamilies.columns.fieldName Erforderlich: Feldname des BigQuery-Ergebnissatzes. Kann in bestimmten Fällen ein leerer String sein. Ein Beispiel für die Verwendung eines leeren fieldName-Werts mit Feldern einfacher Typen finden Sie unter Abfrageergebnisse für den Export vorbereiten.

Abfrageergebnisse für den Export vorbereiten

Zum Exportieren von Abfrageergebnissen nach Bigtable müssen die Ergebnisse die folgenden Voraussetzungen erfüllen:

  • Die Ergebnismenge muss eine Spalte rowkey vom Typ STRING oder BYTES enthalten.
  • Zeilenschlüssel, Spaltenqualifizierer, Werte und Zeitstempel dürfen die Bigtable-Datengrößenlimits in Tabellen nicht überschreiten.
  • In der Ergebnismenge muss außer rowkey mindestens eine weitere Spalte vorhanden sein.
  • Jede Spalte der Ergebnismenge muss einen der unterstützten BigQuery-Typen haben. Alle nicht unterstützten Spaltentypen müssen vor dem Export in Bigtable in einen der unterstützten Spalten konvertiert werden.

Bigtable erfordert keine Spaltenqualifizierer als gültige BigQuery-Spaltennamen und Bigtable unterstützt die Verwendung von Byte. Informationen zum Überschreiben von Zielspaltenqualifizierern für den Export finden Sie unter Exporte mit bigtable_options konfigurieren.

Wenn Sie exportierte Werte mit Bigtable APIs verwenden, z. B. ReadModifyWriteRow, müssen alle numerischen Werte die richtige binäre Codierung verwenden.

Standardmäßig werden eigenständige Ergebnisspalten, die nicht vom Typ STRUCT oder JSON sind, als Werte für Zielspaltenfamilien interpretiert, die dem Namen der Ergebnisspalte entsprechen, und für Spaltenqualifizierer, die einem leeren String entsprechen.

Das folgende SQL-Beispiel veranschaulicht, wie diese Datentypen geschrieben werden. Dabei sind column und column2 eigenständige Ergebnisspalten:

SELECT
  x as column1, y as column2
FROM table

In dieser Beispielabfrage schreibt SELECT x as column1 Werte in Bigtable unter der Spaltenfamilie column1 und dem Spaltenqualifizierer '' (leerer String), wenn Verarbeitungstypen nicht JSON oder STRUCT sind.

Mit der Konfiguration bigtable_options können Sie ändern, wie diese Typen in einem Export geschrieben werden, wie im folgenden Beispiel gezeigt:

EXPORT DATA OPTIONS (
  …
  bigtable_options="""{
   "columnFamilies" : [
      {
        "familyId": "ordered_at",
        "columns": [
           {"qualifierString": "order_time", "fieldName": ""}
        ]
      }
   ]
}"""
) AS
SELECT
  order_id as rowkey,
  STRUCT(product, amount) AS sales_info,
  EXTRACT (MILLISECOND FROM order_timestamp AT TIME ZONE "UTC") AS ordered_at
FROM T

In diesem Beispiel enthält die BigQuery-Tabelle T die folgende Zeile:

order_id order_timestamp product amount
101 2023-03-28T10:40:54Z Joystick 2

Wenn Sie die vorherige bigtable_options-Konfiguration mit der Tabelle T verwenden, werden die folgenden Daten in Bigtable geschrieben:

rowkey sales_info (Spaltenfamilie) ordered_at (Spaltenfamilie)
101 product Menge order_time
1970-01-01T00:00:00Z Joystick 1970-01-01T00:00:00Z 2 1680000054000

1680000054000 steht für 2023-03-28T10:40:54Z in Millisekunden seit der Unix-Epochenzeit in der UTC-Zeitzone.

Zeitstempel für alle Zellen in einer Zeile mit _CHANGE_TIMESTAMP festlegen

Sie können dem Ergebnis für den Export eine _CHANGE_TIMESTAMP-Spalte des Typs TIMESTAMP hinzufügen. Jede in Bigtable geschriebene Zelle verwendet den Zeitstempelwert aus dem _CHANGE_TIMESTAMP der exportierten Ergebniszeile.

Bigtable unterstützt keine Zeitstempel vor der Unix-Epoche (1970-01-01T00:00:00Z). Wenn der Wert _CHANGE_TIMESTAMP NULL ist, wird die Unix-Epochenzeit 0 als Standard-Zeitstempelwert verwendet.

Die folgende Abfrage schreibt Zellen für Spalten product und amount mit dem Zeitstempel, der in der Spalte order_timestamp der Tabelle T angegeben ist.

EXPORT DATA OPTIONS (...) AS
SELECT
  rowkey,
  STRUCT(product, amount) AS sales_info,
  order_timestamp as _CHANGE_TIMESTAMP
FROM T

Mehrere Ergebnisse mit demselben rowkey-Wert exportieren

Wenn Sie ein Ergebnis exportieren, das mehrere Zeilen mit demselben rowkey-Wert enthält, enden die in Bigtable geschriebenen Werte in derselben Bigtable-Zeile.

Mit dieser Methode können Sie mehrere Versionen von Spaltenwerten in derselben Zeile generieren. In diesem Beispiel enthält die Tabelle orders in BigQuery die folgenden Daten:

id customer order_timestamp amount_spent
100 Bob 2023-01-01T10:10:54Z 10.99
101 Alice 2023-01-02T12:10:50Z 102.7
102 Bob 2023-01-04T15:17:01Z 11.1

Der Nutzer führt dann die folgende EXPORT DATA-Anweisung aus:

EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID/tables/TABLE",
format="CLOUD_BIGTABLE"
) AS


SELECT customer as rowkey, STRUCT(amount_spent) as orders_column_family, order_timestamp as _CHANGE_TIMESTAMP
FROM orders

Die Verwendung dieser Anweisung mit der BigQuery-Tabelle orders führt dazu, dass folgende Daten in Bigtable geschrieben werden:

orders_column_family
Zeilenschlüssel amount_spent
Alice 2023-01-02T12:10:50Z 102.7
Bob 2023-01-01T10:10:54Z 10.99
2023-01-04T15:17:01Z 11.1

Beim Exportieren in Bigtable werden neue Werte in der Tabelle zusammengeführt, anstatt ganze Zeilen zu ersetzen. Wenn in Bigtable bereits Werte für einen Zeilenschlüssel vorhanden sind, können neue Werte je nach Spaltenfamilie, Spaltenname und Zeitstempel der geschriebenen Zellen teilweise oder vollständig überschrieben werden.

Mehrere Spalten als Protobuf-Werte (Protokollzwischenspeicher) exportieren

Protokollzwischenspeicher bieten einen flexiblen und effizienten Mechanismus zum Serialisieren von strukturierten Daten. Der Export als Protobuf kann nützlich sein, wenn Sie berücksichtigen, wie verschiedene Typen zwischen BigQuery und Bigtable verarbeitet werden. Sie können benutzerdefinierte BigQuery-Funktionen (User-defined-functions, UDFs) verwenden, um Daten als Protobuf-Binärwerte nach Bigtable zu exportieren. Weitere Informationen finden Sie unter Daten als Protobuf-Spalten exportieren.

Exportoptimierung

Es gibt mehrere Möglichkeiten, den Durchsatz zu erhöhen, mit dem Datensätze von BigQuery nach Bigtable exportiert werden. Sie können die Exportleistung so optimieren:

Preise

Die Preise für den Datenexport finden Sie auf der Seite BigQuery-Preise.

Nachdem die Daten exportiert wurden, wird das Speichern der Daten in Bigtable in Rechnung gestellt. Weitere Informationen finden Sie unter Bigtable-Preise.