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:
- Daten aus einer BigQuery-Tabelle exportieren:
BigQuery-Datenbetrachter (
roles/bigquery.dataViewer
) - Exportjob ausführen:
BigQuery-Nutzer (
roles/bigquery.user
) - Daten in eine Bigtable-Tabelle schreiben:
Bigtable-Nutzer (
roles/bigtable.user
)
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
- Die Codierung ist nur auf
BINARY
undTEXT
beschränkt. - Das Bigtable-Anwendungsprofil muss so konfiguriert sein, dass Daten an einen Bigtable-Cluster weitergeleitet werden, der dem BigQuery-Dataset zugeordnet ist. Weitere Informationen finden Sie unter Überlegungen zum Standort.
- Exporte nach Bigtable werden nur für die Versionen BigQuery Enterprise oder Enterprise Plus unterstützt. BigQuery Standard und On-Demand-Computing werden nicht unterstützt.
Ü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 Regionus-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 Regionasia-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 einenNULL
-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 TypSTRUCT
oderJSON
werden alle Spaltenwerte gelöscht, die zur entsprechenden Spaltenfamilie der betroffenen Zeile gehören. Sie sollten denNULL
-Wert in den TypSTRUCT
oderJSON
umwandeln, damit die SQL-Engine einen korrekten Typ anhängen kann. Durch die folgende Abfrage werden alle Daten aus der Spaltenfamiliecolumn_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 TypSTRING
oderBYTES
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:
- Die Anzahl der Knoten im Bigtable-Zielcluster erhöhen.
- Für das ausgewählte Bigtable-Anwendungsprofil Single-Cluster-Routing konfigurieren
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.