Exporter des données vers Bigtable (ETL inversé)
Ce document explique comment configurer un processus ETL inversé (RETL) de BigQuery vers Bigtable. Pour ce faire, utilisez l'instruction EXPORT DATA
pour exporter les données d'une table BigQuery vers une table Bigtable.
Les utilisateurs de BigQuery peuvent configurer un workflow RETL sur Bigtable qui combine les fonctionnalités d'analyse de BigQuery avec la faible latence et le haut débit de Bigtable. Ce workflow vous permet de diffuser des données aux utilisateurs de l'application sans épuiser les quotas et les limites sur BigQuery.
Caractéristiques des tables Bigtable
Les tables Bigtable présentent plusieurs différences avec les tables BigQuery :
- Les tables Bigtable et BigQuery sont composées de lignes, mais une ligne Bigtable est composée de clés de ligne et de familles de colonnes ayant un nombre arbitraire de colonnes appartenant à la même famille de colonnes.
- Les familles de colonnes d'une table donnée sont créées en même temps que la table, mais elles peuvent également être ajoutées ou supprimées ultérieurement. Lorsqu'une famille de colonnes est créée, il n'est pas nécessaire de spécifier des colonnes qui lui appartiennent.
- Les colonnes Bigtable n'ont pas besoin d'être définies à l'avance et peuvent être utilisées pour stocker des données dans leur nom (également appelé qualificatif) au sein des limites de taille des données dans les tables.
- Les colonnes Bigtable peuvent avoir n'importe quelle valeur binaire au sein des limites de taille des données dans les tables.
- Les colonnes Bigtable ont toujours une dimension temporelle (également appelée version). Un nombre quelconque de valeurs peut être stocké dans n'importe quelle ligne pour la même colonne, à condition que l'horodatage ne soit pas identique.
- L'horodatage Bigtable est mesuré en microsecondes depuis l'époque Unix. Par exemple, 0 représente 1970-01-01T00:00:00 UTC. Les horodatages doivent être un nombre non négatif de microsecondes avec une précision à la milliseconde (seuls les multiples de 1 000 us sont acceptés). Par défaut, l'horodatage Bigtable est 0.
- Dans Bigtable, les données sont lues par clé de ligne, plusieurs clés de ligne, plage de clés de ligne ou à l'aide d'un filtre. Au moins une clé de ligne ou une plage de clés de ligne est requise pour tous les types de requêtes de lecture, à l'exception de l'analyse complète de la table.
Pour en savoir plus sur la préparation des résultats BigQuery à exporter vers Bigtable, consultez la page Préparer les résultats des requêtes pour l'exportation.
Avant de commencer
Attribuez aux utilisateurs des rôles IAM (Identity and Access Management) incluant les autorisations nécessaires pour effectuer l'ensemble des tâches du présent document.
Rôles requis
Pour obtenir les autorisations nécessaires à l'exportation des données BigQuery vers Bigtable, demandez à votre administrateur de vous accorder les rôles IAM suivants sur votre projet :
-
Pour exporter des données depuis une table BigQuery : Lecteur de données BigQuery (
roles/bigquery.dataViewer
) -
Pour exécuter un job d'exportation : Utilisateur BigQuery (
roles/bigquery.user
) -
Écrire des données dans une table Bigtable : Utilisateur Bigtable (
roles/bigtable.user
)
Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.
Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.
Limites
- L'encodage est limité à
BINARY
etTEXT
uniquement. - Les exportations vers Bigtable ne sont compatibles qu'avec les éléments suivants :
- L'ensemble de données BigQuery source doit se trouver dans l'emplacement multirégional des États-Unis.
- Le profil d'application Bigtable doit être configuré pour acheminer les données vers un cluster Bigtable situé aux États-Unis.
- Les exportations vers Bigtable ne sont disponibles que pour les éditions BigQuery Enterprise ou Enterprise Plus. L'édition BigQuery standard et le calcul à la demande ne sont pas acceptés.
Types BigQuery compatibles
Les types de données suivants sont acceptés lorsqu'ils sont écrits dans Bigtable :
Type BigQuery | Valeur Bigtable écrite |
---|---|
BYTES |
Exportée telle quelle. |
STRING |
Convertie en BYTES |
INTEGER |
Si bigtable_options.column_families.encoding est défini sur BINARY , la valeur est écrite dans un format big-endian de 8 octets (l'octet le plus important en premier). Si bigtable_options.column_families.encoding est défini sur TEXT , la valeur est écrite sous la forme d'une chaîne lisible par l'humain représentant un nombre. |
FLOAT |
Écrit une valeur au format de sortie IEEE 754 de 8 octets. |
BOOLEAN |
Si bigtable_options.column_families.encoding est défini sur BINARY , la valeur est écrite sous la forme d'une valeur de 1 octet (false = 0x00 ou true = 0x01). Si bigtable_options.column_families.encoding est défini sur TEXT , la valeur est écrite sous forme de texte ("true" ou "false" ). |
JSON |
Une colonne exportée de type
JSON est interprétée comme un groupe de colonnes appartenant à une famille de colonnes Bigtable spécifique. Les membres de l'objet JSON sont interprétés comme des colonnes et leurs valeurs doivent être écrites dans Bigtable. Le nom de la colonne à écrire peut être ajusté à l'aide de la configuration bigtable_options . Par exemple :
JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY Où les valeurs VALUE1 et VALUE2 sont écrites dans Bigtable en tant que colonnes FIELD1 et FIELD2 dans la famille de colonnes MY_COLUMN_FAMILY.
|
STRUCT |
Une colonne exportée de type
STRUCT est interprétée comme un groupe de colonnes appartenant à une famille de colonnes Bigtable spécifique. Les membres de la structure sont interprétés comme des colonnes et leurs valeurs à écrire dans Bigtable. Le nom de la colonne à écrire peut être ajusté à l'aide de la configuration bigtable_options . Par exemple :
STRUCT<FIELD1 STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY Où les valeurs FIELD1 et FIELD2 sont écrites dans Bigtable en tant que colonnes FIELD1 et FIELD2 dans la famille de colonnes MY_COLUMN_FAMILY.
|
Ces types de données acceptés sont semblables à la lecture de tables Bigtable externes pour BigQuery.
Valeurs NULL
dans Bigtable
Les valeurs NULL
dans Bigtable présentent les contraintes suivantes :
Bigtable n'a pas d'équivalent pour les valeurs
NULL
. L'exportation d'une valeurNULL
pour une famille de colonnes et une colonne données dans Bigtable supprime les valeurs actuelles d'une ligne Bigtable.Si une valeur Bigtable avec une clé de ligne, une famille de colonnes, un qualificatif de colonne et un horodatage donnés n'existent pas avant l'exportation, les valeurs
NULL
exportées n'ont aucun effet sur la ligne Bigtable.Lors de l'exportation d'une valeur
NULL
de typeSTRUCT
ouJSON
, toutes les valeurs de colonne appartenant à la famille de colonnes correspondante de la ligne concernée sont supprimées. Vous devez convertir la valeurNULL
en fonction du typeSTRUCT
ouJSON
pour que le moteur SQL lui associe un type approprié. La requête suivante supprime toutes les données de la famille de colonnescolumn_family1
avec un ensemble de clés de ligne données :EXPORT DATA OPTIONS (...) AS SELECT rowkey, CAST(NULL as STRUCT
) AS column_family1 FROM T Les lignes contenant
NULL
clés de ligne sont ignorées lors de l'exportation. Le nombre de lignes ignorées est renvoyé à l'appelant dans les statistiques d'exportation.
Configurer des exportations avec bigtable_options
Vous pouvez utiliser la configuration bigtable_options
lors d'une exportation pour combler les différences entre les modèles de stockage BigQuery et Bigtable. La configuration est exprimée sous la forme d'une chaîne JSON, comme illustré dans l'exemple suivant :
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
" } ] }] }""" )
Le tableau suivant décrit les champs possibles utilisés dans une configuration bigtable_options
:
Field name | Description |
---|---|
columnFamilies |
Tableau de descripteurs de famille de colonnes. |
columnFamilies.familyId |
Identifiant de famille de colonnes Bigtable. |
columnFamilies.encoding |
La valeur peut être définie sur BINARY ou TEXT . Pour en savoir plus sur l'encodage des types, consultez la section Types BigQuery compatibles. |
columnFamilies.columns |
Tableau de mappages de colonnes Bigtable. |
columnFamilies.columns.qualifierString |
Facultatif : qualificatif de colonne Bigtable. Spécifiez cette valeur si le qualificatif de colonne ne comporte pas de code non UTF-8. Les champs qualifierString et qualifierEncoding s'excluent mutuellement. Si vous ne spécifiez ni qualifierString , ni qualifierEncoded , fieldName est utilisé comme qualificatif de colonne. |
columnFamilies.columns.qualifierEncoded |
Facultatif : Qualificatif de colonne encodé en base64. Semblable à qualifierString si le qualificatif de colonne doit comporter des codes non UTF-8. |
columnFamilies.columns.fieldName |
Obligatoire : Nom du champ de l'ensemble de résultats BigQuery. Dans certains cas, peut être une chaîne vide. Pour obtenir un exemple d'utilisation d'une valeur fieldName vide avec des champs de types simples, consultez la section Préparer les résultats des requêtes pour l'exportation. |
Préparer les résultats des requêtes pour l'exportation
Pour exporter des résultats de requête vers Bigtable, les résultats doivent répondre aux exigences suivantes :
- L'ensemble de résultats doit contenir une colonne
rowkey
de typeSTRING
ouBYTES
. - Les clés de ligne, les qualificatifs de colonnes, les valeurs et les horodatages ne doivent pas dépasser les limites de taille des données dans les tables.
- Au moins une colonne autre que
rowkey
doit être présente dans l'ensemble de résultats. - Chaque colonne d'ensemble de résultats doit correspondre à l'un des types BigQuery compatibles. Tous les types de colonne non compatibles doivent être convertis en l'un des types compatibles avant l'exportation vers Bigtable.
Bigtable ne nécessite pas que les qualificatifs de colonne soient des noms de colonnes BigQuery valides, et Bigtable accepte l'utilisation d'octets. Pour en savoir plus sur le remplacement des qualificatifs de colonnes cibles pour une exportation, consultez la page Configurer des exportations avec bigtable_options
.
Si vous utilisez des valeurs exportées avec les API Bigtable, telles que ReadModifyWriteRow
, toutes les valeurs numériques doivent utiliser l'encodage binaire approprié.
Par défaut, les colonnes de résultats autonomes de type autre que STRUCT
ou JSON
sont interprétées comme des valeurs pour les familles de colonnes de destination égales au nom de la colonne de résultat, et le qualificatif de colonne est égal à une chaîne vide.
Pour illustrer la façon dont ces types de données sont écrits, considérons l'exemple SQL suivant, dans lequel column
et column2
sont des colonnes de résultats autonomes :
SELECT
x as column1, y as column2
FROM table
Dans cet exemple de requête, SELECT x as column1
écrit des valeurs dans Bigtable sous la famille de colonnes column1
et ''
(chaîne vide) dans le qualificatif de colonne lors du traitement de types autres que JSON
ou STRUCT
.
Vous pouvez modifier la façon dont ces types sont écrits dans une exportation à l'aide de la configuration bigtable_options
, comme le montre l'exemple suivant :
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
Dans cet exemple, la table BigQuery T
contient la ligne suivante :
order_id |
order_timestamp |
product |
amount |
---|---|---|---|
101 | 2023-03-28T10:40:54Z | Joystick | 2 |
Si vous utilisez la configuration bigtable_options
précédente avec la table T
, les données suivantes sont écrites dans Bigtable :
rowkey |
sales_info (famille de colonnes) |
ordered_at (famille de colonnes) |
|||
---|---|---|---|---|---|
101 | product | amount | order_time | ||
1970-01-01T00:00:00Z | Joystick | 1970-01-01T00:00:00Z | 2 | 1680000054000 |
1680000054000
représente la valeur 2023-03-28T10:40:54Z
en millisecondes écoulées depuis l'epoch Unix dans le fuseau horaire UTC.
Définir l'horodatage pour toutes les cellules d'une ligne à l'aide de _CHANGE_TIMESTAMP
Vous pouvez ajouter une colonne _CHANGE_TIMESTAMP
de type TIMESTAMP
au résultat d'exportation.
Chaque cellule écrite dans Bigtable utilise la valeur d'horodatage indiquée dans le champ _CHANGE_TIMESTAMP
de la ligne de résultat exportée.
Bigtable n'accepte pas les horodatages antérieurs à l'époque Unix (1970-01-01T00:00:00Z). Si la valeur _CHANGE_TIMESTAMP
est définie sur NULL
, l'epoch Unix de 0
est utilisé comme valeur d'horodatage par défaut.
La requête suivante écrit des cellules pour les colonnes product
et amount
avec l'horodatage spécifié dans la colonne order_timestamp
de la table T
.
EXPORT DATA OPTIONS (...) AS SELECT rowkey, STRUCT(product, amount) AS sales_info, order_timestamp as _CHANGE_TIMESTAMP FROM T
Exporter plusieurs résultats avec la même valeur rowkey
Lorsque vous exportez un résultat contenant plusieurs lignes avec la même valeur rowkey
, les valeurs écrites dans Bigtable se retrouvent dans la même ligne Bigtable.
Vous pouvez utiliser cette méthode pour générer plusieurs versions de valeurs de colonnes sur la même ligne. Dans cet exemple, la table orders
de BigQuery contient les données suivantes :
id |
customer |
order_timestamp |
amount_spent |
---|---|---|---|
100 | Robert | 2023-01-01T10:10:54Z | 10.99 |
101 | Alice | 2023-01-02T12:10:50Z | 102.7 |
102 | Robert | 2023-01-04T15:17:01Z | 11.1 |
L'utilisateur exécute ensuite l'instruction EXPORT DATA
suivante :
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
L'utilisation de cette instruction avec la table BigQuery orders
entraîne l'écriture des données suivantes dans Bigtable :
orders_column_family | ||
---|---|---|
Clé de ligne | amount_spent | |
Alice | 2023-01-02T12:10:50Z | 102.7 |
Robert | 2023-01-01T10:10:54Z | 10.99 |
2023-01-04T15:17:01Z | 11.1 |
L'exportation vers Bigtable fusionne de nouvelles valeurs dans la table au lieu de remplacer des lignes entières. Si des valeurs sont déjà présentes dans Bigtable pour une clé de ligne, les nouvelles valeurs peuvent remplacer partiellement ou complètement les valeurs antérieures en fonction de la famille de colonnes, des noms de colonnes et des horodatages des cellules en cours d'écriture.
Exporter plusieurs colonnes en tant que valeurs du tampon de protocole (Protobuf)
Les tampons de protocole représentent un mécanisme flexible et efficace pour sérialiser des données structurées. L'exportation en tant que Protobuf peut être utile en tenant compte de la gestion des différents types entre BigQuery et Bigtable. Vous pouvez utiliser des fonctions définies par l'utilisateur BigQuery pour exporter des données en tant que valeurs binaires Protobuf vers Bigtable. Pour en savoir plus, consultez la section Exporter des données sous forme de colonnes Protobuf.
Optimisation des exportations
Il existe plusieurs façons d'augmenter le débit auquel les enregistrements sont exportés de BigQuery vers Bigtable. Vous pouvez optimiser vos performances d'exportation de différentes manières:
- En augmentant le nombre de nœuds dans le cluster de destination Bigtable.
- Configuration du profil d'application Bigtable choisi sur un routage à cluster unique.
Tarification
Pour en savoir plus sur la tarification de l'exportation de données, consultez la page Tarifs de BigQuery.
Une fois les données exportées, leur stockage dans Bigtable vous est facturé. Pour en savoir plus, consultez la page Tarifs de Bigtable.