Tables BigQuery pour Apache Iceberg
Pour obtenir de l'aide pendant la période de disponibilité en version preview, envoyez un e-mail à bigquery-tables-for-apache-iceberg-help@google.com.
Les tables BigQuery pour Apache Iceberg (ci-après dénommées les tables Iceberg) constituent la base de la création de lakehouses au format ouvert sur Google Cloud. Les tables Iceberg offrent la même expérience entièrement gérée que les tables BigQuery, mais stockent les données dans des buckets de stockage détenus par le client, en passant par Parquet afin d'assurer l'interopérabilité avec les formats de table ouverts Iceberg.
Les tables BigQuery pour Apache Iceberg sont distinctes des tables externes BigLake pour Apache Iceberg, car seules les tables BigQuery pour Apache Iceberg sont modifiables directement dans BigQuery. Les tables externes BigLake pour Apache Iceberg sont des tables en lecture seule générées à partir d'un autre moteur de requêtes, tel qu'Apache Spark, et ne peuvent être interrogées qu'à l'aide de BigQuery.
Les tables Iceberg sont compatibles avec les fonctionnalités suivantes:
- Mutations de table à l'aide du langage de manipulation de données (LMD) GoogleSQL.
- Traitement par lot et par flux unifié, à haut débit, à l'aide de l'API Storage Write via les connecteurs BigLake tels que Spark, Dataflow et d'autres moteurs.
- Évolution du schéma, qui vous permet d'ajouter, de supprimer et de renommer des colonnes en fonction de vos besoins. Cette fonctionnalité vous permet également de modifier le type de données d'une colonne existante et le mode de la colonne. Pour en savoir plus, consultez les règles de conversion de type.
- Optimisation automatique du stockage, y compris la mise à l'échelle adaptative des fichiers, le clustering automatique, la récupération de mémoire et l'optimisation des métadonnées.
- Sécurité au niveau des colonnes et masquage des données.
Architecture
Les tables Iceberg proposent les atouts de la gestion de ressources BigQuery, pour les tables qui se trouvent dans vos propres buckets cloud. Les tables Iceberg vous permettent d'utiliser BigQuery sur ces tables sans devoir déplacer les données hors des buckets que vous contrôlez.
Le schéma suivant illustre l'architecture générale des tables gérées :
Cette gestion des tables a les implications suivantes sur votre bucket :
- BigQuery crée des fichiers de données dans le bucket en réponse aux requêtes d'écriture et aux optimisations de l'espace de stockage en arrière-plan, telles que les instructions LMD et le traitement par flux.
- Lorsque vous supprimez une table gérée dans BigQuery, BigQuery ne supprime pas les fichiers de données associés. Vous devez confirmer la suppression en supprimant manuellement du bucket les fichiers et les métadonnées de table exportées.
- Les tables Iceberg n'entraînent aucun coût de stockage BigQuery. Pour en savoir plus, consultez la section Facturation.
La création d'une table Iceberg est semblable à la création de tables BigQuery. Comme une table gérée stocke les données dans des formats ouverts sur Cloud Storage, elle offre davantage de possibilités :
- Spécifiez la connexion de ressources Cloud avec
WITH CONNECTION
, pour configurer les identifiants de connexion de BigLake afin d'accéder à Cloud Storage. - Spécifier le format de fichier pour le stockage de données avec
file_format
.PARQUET
est compatible avec la version preview. - Spécifier le format de la table de métadonnées Open Source avec
table_format
.ICEBERG
est compatible avec la version preview.
Bonnes pratiques
Modifier ou ajouter directement des fichiers au bucket en dehors de BigQuery peut entraîner une perte de données ou des erreurs irrécupérables. Le tableau suivant décrit les scénarios possibles:
Opération | Conséquences | Prévention |
---|---|---|
Ajout de fichiers au bucket en dehors de BigQuery. | Perte de données : les nouveaux fichiers ou objets ajoutés en dehors de BigQuery ne sont pas intégrés au processus de suivi assuré par BigQuery. Les fichiers non suivis sont supprimés par les processus de récupération de mémoire en arrière-plan. | Ajout de données exclusivement via BigQuery. Cela permet à BigQuery de suivre les fichiers et d'empêcher leur suppression par le processus de récupération de mémoire. Pour éviter les ajouts accidentels et la perte de données, nous vous recommandons également de limiter les autorisations d'écriture des outils externes sur les buckets contenant des tables Iceberg. |
Créez une table Iceberg dans un préfixe non vide. | Perte de données : les données existantes ne sont pas soumis au suivi effectué par BigQuery. Ces fichiers sont donc considérés comme non suivis et supprimés par les processus de récupération de mémoire en arrière-plan. | Ne créez des tables Iceberg que dans des préfixes vides. |
Modifier ou remplacer les fichiers de données de table Iceberg. | Perte de données : en cas de modification ou de remplacement externe, la table ne passe pas la vérification de la cohérence et devient illisible. Les requêtes sur la table échouent. Il n'existe alors aucun moyen permettant de revenir à une situation normale en autonomie. Contactez l'assistance pour obtenir de l'aide sur la récupération des données. |
Modifiez les données exclusivement via BigQuery. Cela permet à BigQuery de suivre les fichiers et d'empêcher leur suppression par le processus de récupération de mémoire. Pour éviter les ajouts accidentels et la perte de données, nous vous recommandons également de limiter les autorisations d'écriture des outils externes sur les buckets contenant des tables Iceberg. |
Création de deux tables BigQuery pour Apache Iceberg sur les mêmes URI ou sur des URI qui se chevauchent. | Perte de données:BigQuery ne crée pas de pont entre des instances d'URI identiques de tables Iceberg. Les processus de récupération de mémoire en arrière-plan pour chaque table considèrent les fichiers de la table opposée comme étant non suivis, et vont donc les supprimer, ce qui entraîne une perte de données. | Utilisez des URI uniques pour chaque table Iceberg. |
Considérations au sujet des emplacements
Vous pouvez améliorer les performances en utilisant des buckets Cloud Storage à région unique ou birégionaux au lieu des buckets multirégionaux.
Facturation
Les fonctionnalités suivantes sont facturées selon les tarifs publiés existants :
- Tarifs de Cloud Storage pour toutes les données stockées dans les buckets Cloud Storage, le traitement des données effectué par Cloud Storage et l'utilisation du réseau pour la quantité de données lue dans votre bucket.
- Tarifs de calcul BigQuery pour les requêtes, le LMD et l'optimisation du stockage en arrière-plan (y compris le clustering, l'agglomération et la récupération de mémoire).
- Les frais liés aux réservations (emplacements) suivent les tarifs existants pour les emplacements.
- Les frais basés sur des unités de gestion des stocks (SKU) à la demande suivent les tarifs à la demande existants. Pour en savoir plus, consultez la section Coûts associés à BigLake.
- Le chargement par lot et l'opération de calcul Extract sont facturés à l'aide de SKU à la demande ou de réservations (emplacements).
- Tarifs de l'API Storage Read pour la lecture à partir de Spark via l'API Read.
- Tarifs de l'API Storage Write pour le traitement par flux.
Workflows associés aux tables Iceberg
Les sections suivantes expliquent comment créer, charger, gérer et interroger des tables gérées.
Avant de commencer
Avant de créer et d'utiliser des tables Iceberg, assurez-vous d'avoir configuré une connexion aux ressources cloud sur un bucket de stockage. Votre connexion a besoin d'autorisations en écriture sur le bucket de stockage, comme indiqué dans la section Rôles requis ci-dessous.
Rôles requis
Pour obtenir les autorisations nécessaires pour autoriser BigQuery à gérer les tables de votre projet, demandez à votre administrateur de vous accorder les rôles IAM suivants :
-
Pour créer des tables Iceberg :
-
Propriétaire de données BigQuery (
roles/bigquery.dataOwner
) sur votre projet -
Administrateur de connexion BigQuery (
roles/bigquery.connectionAdmin
) sur votre projet
-
Propriétaire de données BigQuery (
-
Pour interroger des tables Iceberg :
-
Lecteur de données BigQuery (
roles/bigquery.dataViewer
) sur votre projet -
Utilisateur BigQuery (
roles/bigquery.user
) sur votre projet
-
Lecteur de données BigQuery (
-
Pour que le compte de service de connexion puisse lire et écrire des données dans Cloud Storage :
- Administrateur des objets de l'espace de stockage (
roles/storage.objectAdmin
) sur le bucket -
Lecteur des anciens buckets Storage (
roles/storage.legacyBucketReader
) sur le bucket
- Administrateur des objets de l'espace de stockage (
Pour en savoir plus sur l'attribution de rôles, consultez la page Gérer l'accès aux projets, aux dossiers et aux organisations.
Ces rôles prédéfinis contiennent les autorisations requises pour permettre à BigQuery de gérer les tables de votre projet. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :
Autorisations requises
Les autorisations suivantes sont requises pour autoriser BigQuery à gérer les tables de votre projet :
bigquery.connections.delegate
sur votre projetbigquery.jobs.create
sur votre projetbigquery.readsessions.create
sur votre projetbigquery.tables.create
sur votre projetbigquery.tables.get
sur votre projetbigquery.tables.getData
sur votre projetstorage.buckets.get
sur votre projetstorage.objects.create
sur votre projetstorage.objects.delete
sur votre projetstorage.objects.get
sur votre projetstorage.objects.list
sur votre projet
Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.
Créer des tables Iceberg
Pour créer une table Iceberg, sélectionnez l'une des méthodes suivantes:
SQL
CREATE TABLE [PROJECT_NAME.]DATASET_NAME.TABLE_NAME ( COLUMN DATA_TYPE[, ...] ) CLUSTER BY CLUSTER_COLUMN_LIST WITH CONNECTION CONNECTION_NAME OPTIONS ( file_format = 'PARQUET', table_format = 'ICEBERG', storage_uri = 'STORAGE_URI');
Remplacez les éléments suivants :
- PROJECT_NAME : projet contenant l'ensemble de données. Si cet élément n'est pas défini, la commande utilise le projet par défaut.
- DATASET_NAME : ensemble de données existant.
- TABLE_NAME : nom de la table que vous créez.
- DATA_TYPE : type de données des informations contenues dans la colonne.
- CLUSTER_COLUMN_LIST : liste de quatre colonnes au maximum, séparées par des virgules. Ces colonnes doivent être des colonnes uniques de premier niveau.
- CONNECTION_NAME : nom de la connexion. Exemple :
myproject.us.myconnection
. - STORAGE_URI : URI Cloud Storage complet.
Par exemple,
gs://mybucket/table
.
bq
bq --project_id=PROJECT_NAME mk \ --file_format=PARQUET \ --table_format=ICEBERG \ --connection_id=CONNECTION_NAME \ --storage_uri=STORAGE_URI \ --schema=COLUMN_NAME:DATA_TYPE[, ...] \ --clustering_fields=CLUSTER_COLUMN_LIST \ MANAGED_TABLE_NAME
Remplacez les éléments suivants :
- PROJECT_NAME : projet contenant l'ensemble de données. Si cet élément n'est pas défini, la commande utilise le projet par défaut.
- CONNECTION_NAME : nom de la connexion. Exemple :
myproject.us.myconnection
. - STORAGE_URI : URI Cloud Storage complet.
Par exemple,
gs://mybucket/table
. - COLUMN_NAME : nom de la colonne.
- DATA_TYPE : type de données des informations contenues dans la colonne.
- CLUSTER_COLUMN_LIST : liste de quatre colonnes au maximum, séparées par des virgules. Ces colonnes doivent être des colonnes uniques de premier niveau.
- MANAGED_TABLE_NAME : nom de la table que vous créez.
API
Appelez la méthode tables.insert
avec une ressource de table définie, comme suit :
{ "tableReference": { "tableId": "TABLE_NAME" }, "biglakeConfiguration": { "connectionId": "CONNECTION_NAME", "fileFormat": "PARQUET", "tableFormat": "ICEBERG", "storageUri": "STORAGE_URI" }, "schema": { "fields": [ { "name": "COLUMN_NAME", "type": "DATA_TYPE" } [, ...] ] } }
Remplacez les éléments suivants :
- TABLE_NAME : nom de la table que vous créez.
- CONNECTION_NAME : nom de la connexion. Exemple :
myproject.us.myconnection
. - STORAGE_URI : URI Cloud Storage complet.
Les caractères génériques sont également acceptés. Par exemple,
gs://mybucket/table
. - COLUMN_NAME : nom de la colonne.
- DATA_TYPE : type de données des informations contenues dans la colonne.
Importer des données dans une table Iceberg
Les sections suivantes expliquent comment importer des données depuis des tables de différents formats dans des tables Iceberg.
Chargement rapide à partir de fichiers Parquet
L'option copy_files_only
vous permet de charger des données plus rapidement en copiant vos fichiers Parquet existants, plutôt que de lire le contenu et de le réécrire sous forme de nouveaux fichiers. Le chargement rapide utilise moins de capacité de calcul qu'un chargement de fichier standard.
Les fichiers Parquet doivent être compatibles avec la spécification Apache Iceberg et comporter des statistiques de colonne complètes. Le chargement rapide ne détecte pas les valeurs non valides (telles que les codes temporels hors plage) présentes dans les fichiers, car ceux-ci ne sont pas lus ni retraités. Pour en savoir plus sur le chargement de fichiers Parquet, consultez la section Charger des données Parquet dans une nouvelle table.
Pour charger rapidement des fichiers Parquet plats dans une table Iceberg existante, utilisez la commande bq load
:
bq load \ --copy_files_only \ --source_format=PARQUET \ DATASET_NAME.TABLE_NAME \ PATH_TO_SOURCE
Remplacez les éléments suivants :
- DATASET_NAME: ensemble de données contenant votre table Iceberg.
- TABLE_NAME: nom de la table Iceberg dans laquelle vous chargez des données.
- PATH_TO_SOURCE : URI Cloud Storage complet ou liste d'URI séparés par des virgules.
Les caractères génériques sont également acceptés. Par exemple,
gs://mybucket/mydata*.parquet
.
Chargement standard de données à partir de fichiers plats
Les tables Iceberg utilisent des jobs de chargement BigQuery pour charger des fichiers externes dans des tables Iceberg. Si vous disposez d'une table Iceberg, suivez le guide de la CLI bq load
ou le guide SQL LOAD
pour charger des données externes. Après le chargement des données, de nouveaux fichiers Parquet sont écrits dans le dossier STORAGE_URI/data
.
Si les instructions précédentes sont utilisées sans table Iceberg existante, une table BigQuery est créée à la place.
Consultez les sections suivantes pour obtenir des exemples de chargement par lot dans des tables gérées, spécifiques aux différents outils :
SQL
LOAD DATA INTO MANAGED_TABLE_NAME FROM FILES ( uris=['STORAGE_URI'], format='FILE_FORMAT');
Remplacez les éléments suivants :
- MANAGED_TABLE_NAME: nom d'une table Iceberg existante.
- STORAGE_URI : URI Cloud Storage complet ou liste d'URI séparés par des virgules.
Les caractères génériques sont également acceptés. Par exemple,
gs://mybucket/table
. - FILE_FORMAT : format de la table source. Pour connaître les formats acceptés, consultez la ligne
format
deload_option_list
.
bq
bq load \ --source_format=FILE_FORMAT \ MANAGED_TABLE \ STORAGE_URI
Remplacez les éléments suivants :
- FILE_FORMAT : format de la table source. Pour connaître les formats acceptés, consultez la ligne
format
deload_option_list
. - MANAGED_TABLE_NAME: nom d'une table Iceberg existante.
- STORAGE_URI : URI Cloud Storage complet ou liste d'URI séparés par des virgules.
Les caractères génériques sont également acceptés. Par exemple,
gs://mybucket/table
.
Chargement standard à partir de fichiers partitionnés avec Hive
Vous pouvez charger des fichiers partitionnés avec Hive dans des tables Iceberg à l'aide de jobs de chargement BigQuery standards. Pour en savoir plus, consultez la page Charger des données partitionnées externes.
Charger des données de traitement par flux à partir de Pub/Sub
Vous pouvez charger des données de traitement par flux dans des tables Iceberg à l'aide d'un abonnement Pub/Sub BigQuery.
Exporter des données depuis des tables Iceberg
Les sections suivantes décrivent comment exporter des données à partir de tables Iceberg vers différents formats de table.
Exporter des données vers des formats de fichiers plats
Pour exporter une table Iceberg vers un format de fichier plat, utilisez l'instruction EXPORT DATA
et sélectionnez un format de destination. Pour en savoir plus, consultez la section Exporter des données.
Lire des tables Iceberg avec des métadonnées Iceberg
Pour lire les données des tables Iceberg au format Iceberg, procédez comme suit:
Exportez les métadonnées au format Iceberg à l'aide de l'instruction SQL
EXPORT TABLE METADATA
.Configurez et lisez les données de table dans Apache Spark avec
HadoopCatalog
.L'exemple suivant configure votre environnement pour utiliser Spark SQL avec Apache Iceberg, puis exécute une requête pour extraire les données d'une table Iceberg spécifiée.
spark-sql \ --packages org.apache.iceberg:iceberg-spark-runtime-ICEBERG_VERSION_NUMBER \ --conf spark.sql.catalog.CATALOG_NAME=org.apache.iceberg.spark.SparkCatalog \ --conf spark.sql.catalog.CATALOG_NAME.type=hadoop \ --conf spark.sql.catalog.CATALOG_NAME.warehouse='BUCKET_PATH' \ # Queries the table spark-sql> SELECT * FROM CATALOG_NAME.FOLDER_NAME;
Remplacez les éléments suivants :
- ICEBERG_VERSION_NUMBER : version actuelle de l'environnement d'exécution Apache Spark/Iceberg. Téléchargez la dernière version sur la page Spark Releases (versions Spark).
- CATALOG_NAME: catalogue permettant de référencer votre table Iceberg.
- BUCKET_PATH : chemin d'accès au bucket contenant les fichiers de table. Exemple :
gs://mybucket/
- FOLDER_NAME : dossier contenant les fichiers de table.
Exemple :
myfolder
Modifier des tables Iceberg
Pour modifier une table Iceberg, suivez la procédure décrite dans la section Modifier des schémas de table.
Tarifs
La tarification des tables Iceberg comprend trois composants distincts:
Stockage
Les tables Iceberg stockent toutes les données dans Cloud Storage. Vous êtes facturé pour toutes les données stockées, y compris les données historiques des tables. Des frais de traitement des données et de transfert, liés à Cloud Storage, peuvent également s'appliquer le cas échéant. Il n'y a pas de frais de stockage spécifiques à BigQuery. Pour en savoir plus, consultez la page Tarifs de Cloud Storage.
Optimisation du stockage
Les tables Iceberg nécessitent des opérations d'optimisation du stockage, telles que l'agglomération de fichiers et le re-clustering.
Ces opérations d'optimisation utilisent des emplacements Enterprise Edition soumis au paiement à l'usage, et n'utilisent pas les réservations BACKGROUND
existantes.
Les opérations d'exportation de données qui ont lieu lors du traitement par flux via l'API BigQuery Storage Write sont incluses dans les tarifs de l'API Storage Write, et ne sont pas facturées comme des opérations de maintenance en arrière-plan. Pour en savoir plus, consultez la page Tarifs de l'ingestion de données.
Requêtes et jobs
Comme pour les tables BigQuery, vous êtes facturé pour les requêtes et les octets lus (par Tio), si vous utilisez la tarification à la demande de BigQuery, ou bien pour la consommation d'emplacements (par emplacement et par heure), si vous utilisez la tarification par capacité de calcul de BigQuery.
Les tarifs BigQuery s'appliquent également à l'API BigQuery Storage Read et à l'API BigQuery Storage Write.
Les opérations de chargement et d'exportation (telles que EXPORT METADATA
) utilisent des emplacements Enterprise Edition soumis au paiement à l'usage.
Cela diffère des tables BigQuery, pour lesquelles ces opérations ne sont pas facturées. Si des réservations PIPELINE
avec des emplacements Enterprise ou Enterprise Plus sont disponibles, les opérations de chargement et d'exportation utilisent de préférence ces emplacements de réservation.
Limites
Les tables Iceberg présentent les limites suivantes:
- Les tables Iceberg ne sont pas compatibles avec les opérations de renommage ni avec les instructions
ALTER TABLE RENAME TO
. - Les tables Iceberg ne sont pas compatibles avec les copies de tables ni avec les instructions
CREATE TABLE COPY
. - Les tables Iceberg ne sont pas compatibles avec les clones de table ni avec les instructions
CREATE TABLE CLONE
. - Les tables Iceberg ne sont pas compatibles avec les instantanés de table ni avec les instructions
CREATE SNAPSHOT TABLE
. - Les tables Iceberg ne sont pas compatibles avec le schéma de table suivant :
- Schéma vide.
- Schéma comportant les types de données
INTERVAL
,JSON
,RANGE
ouGEOGRAPHY
. - Schéma comportant des classements de champs.
- Schéma comportant des expressions de valeur par défaut.
EXPORT METADATA
n'est pas compatible avec les tables contenant des types de donnéesBIGNUMERIC
ouNUMERIC
avec une précision supérieure à 38 positions.- Les tables Iceberg ne sont pas compatibles avec les cas d'évolution de schéma suivants :
- Coercitions du type
NUMERIC
en typeFLOAT
- Coercitions du type
INT
en typeFLOAT
- Ajout de champs imbriqués à des colonnes
RECORD
existantes à l'aide d'instructions LDD SQL
- Coercitions du type
- Les tables Iceberg affichent une taille de stockage de 0 octet lorsqu'elles sont interrogées par la console ou les API.
- Les tables Iceberg ne sont pas compatibles avec les vues matérialisées.
- Les tables Iceberg ne sont pas compatibles avec les transactions multi-instructions.
- Les tables Iceberg ne sont pas compatibles avec les mises à jour de capture des données modifiées (CDC).
- Lorsque vous transmettez des données en continu vers des tables Iceberg à l'aide de l'API BigQuery Storage Write, vous devez d'abord désactiver le cache de requêtes.
- Les tables Iceberg ne sont pas compatibles avec la reprise après sinistre gérée.
- Les tables Iceberg ne sont pas compatibles avec le partitionnement. Vous pouvez à la place envisager d'utiliser le clustering.
- Les tables Iceberg ne sont pas compatibles avec la sécurité au niveau des lignes.
- Les tables Iceberg ne sont pas compatibles avec la fonctionnalité temporelle.
- Les tables Iceberg ne sont pas compatibles avec les périodes de prévention des défaillances.
- Les tables Iceberg ne sont pas compatibles avec les jobs d'extraction.
- La vue
INFORMATION_SCHEMA.TABLE_STORAGE
n'inclut pas les tables Iceberg. - Les tables Iceberg ne sont pas acceptées en tant que destinations de résultats de requête.
- L'instruction
CREATE OR REPLACE
ne permet pas de remplacer des tables standards par des tables Iceberg, ni des tables Iceberg par des tables standards. - Le chargement par lot et les instructions
LOAD DATA
ne permettent d'ajouter des données qu'aux tables Iceberg existantes. - Le chargement par lot et les instructions
LOAD DATA
ne sont pas compatibles avec les mises à jour de schéma. TRUNCATE TABLE
n'est pas compatible avec les tables Iceberg. Il existe deux alternatives :CREATE OR REPLACE TABLE
, en utilisant les mêmes options de création de table.- L'instruction
DELETE FROM
tableWHERE
true.
- La fonction de valeur de table
APPENDS
n'est pas compatible avec les tables Iceberg. - Les exportations Iceberg dans Apache Spark ne contiennent pas les données récemment soumises au traitement par flux dans le stockage optimisé en écriture.
- Le chargement rapide n'est pas compatible avec les fichiers comportant des noms de colonne flexibles.