Créer des tables externes en lecture seule Apache Iceberg

Les tables externes en lecture seule Apache Iceberg vous permettent d'accéder aux tables Apache Iceberg avec un contrôle des accès plus précis, au format en lecture seule. Cette fonctionnalité contraste avec les tables BigLake pour Apache Iceberg dans BigQuery, qui vous permettent de créer des tables Iceberg dans BigQuery au format en écriture.

Iceberg est un format de table Open Source compatible avec les tables de données à l'échelle du pétaoctet. La spécification ouverte Iceberg vous permet d'exécuter plusieurs moteurs de requête sur une seule copie de données stockées dans un store d'objets. Les tables externes en lecture seule Apache Iceberg (ci-après appelées tables en lecture seule Iceberg) sont compatibles avec la version 2 de la spécification Iceberg, y compris la fusion lors de la lecture.

En tant qu'administrateur BigQuery, vous pouvez appliquer le contrôle des accès au niveau des lignes et des colonnes, y compris le masquage des données sur les tables. Pour en savoir plus sur la configuration du contrôle des accès au niveau de la table, consultez la page Configurer des stratégies de contrôle d'accès. Les stratégies d'accès aux tables sont également appliquées lorsque vous utilisez l'API BigQuery Storage en tant que source de données pour la table dans Dataproc et Spark sans serveur.

Vous pouvez créer des tables Iceberg en lecture seule de différentes manières:

  • Avec BigLake Metastore (recommandé pour Trusted Cloud by S3NS). BigLake Metastore est basé sur le catalogue BigQuery et s'intègre directement à BigQuery. Les tables du métastore BigLake sont modifiables à partir de plusieurs moteurs Open Source, et les mêmes tables peuvent être interrogées à partir de BigQuery. Le metastore BigLake est également compatible avec l'intégration directe à Apache Spark.

  • Avec AWS Glue Data Catalog (recommandé pour AWS). AWS Glue est la méthode recommandée pour AWS, car il s'agit d'un référentiel de métadonnées centralisé dans lequel vous définissez la structure et l'emplacement de vos données stockées dans divers services AWS. Il offre des fonctionnalités telles que la découverte automatique de schémas et l'intégration aux outils d'analyse AWS.

  • Avec des fichiers de métadonnées JSON Iceberg (recommandé pour Azure). Si vous utilisez un fichier de métadonnées JSON Iceberg, vous devez mettre à jour manuellement le dernier fichier de métadonnées chaque fois que des tables sont mises à jour. Vous pouvez utiliser une procédure stockée BigQuery pour Apache Spark afin de créer des tables Iceberg en lecture seule qui référencent un fichier de métadonnées Iceberg.

Pour obtenir la liste complète des limites, consultez la section Limites.

Avant de commencer

Rôles requis

Pour obtenir les autorisations nécessaires pour créer une table Iceberg en lecture seule, demandez à votre administrateur de vous accorder les rôles IAM suivants sur le projet:

Pour en savoir plus sur l'attribution de rôles, consultez Gérer l'accès aux projets, aux dossiers et aux organisations.

Ces rôles prédéfinis contiennent les autorisations requises pour créer une table Iceberg en lecture seule. Pour connaître les autorisations exactes requises, développez la section Autorisations requises :

Autorisations requises

Les autorisations suivantes sont requises pour créer une table Iceberg en lecture seule:

  • bigquery.tables.create
  • bigquery.connections.delegate
  • bigquery.jobs.create

Vous pouvez également obtenir ces autorisations avec des rôles personnalisés ou d'autres rôles prédéfinis.

Créer des tables avec BigLake Metastore

Nous vous recommandons de créer des tables Iceberg en lecture seule avec BigLake Metastore. Vous pouvez utiliser Apache Spark pour créer ces tables. Pour ce faire, utilisez des procédures stockées BigQuery. Pour obtenir un exemple, consultez la section Créer et exécuter une procédure stockée.

Créer des tables avec un fichier de métadonnées

Vous pouvez créer des tables Iceberg en lecture seule avec un fichier de métadonnées JSON. Toutefois, cette méthode n'est pas recommandée car vous devez mettre à jour l'URI du fichier de métadonnées JSON manuellement pour maintenir la table Iceberg en lecture seule à jour. Si l'URI n'est pas mis à jour, les requêtes dans BigQuery peuvent échouer ou fournir des résultats différents de ceux d'autres moteurs de requête, qui utilisent directement un catalogue Iceberg.

Les fichiers de métadonnées de la table Iceberg sont créés dans le bucket Cloud Storage que vous spécifiez lorsque vous créez une table Iceberg à l'aide de Spark.

Sélectionnez l'une des options suivantes :

SQL

Utilisez l'instruction CREATE EXTERNAL TABLE. L'exemple suivant crée une table Iceberg en lecture seule nommée myexternal-table:

  CREATE EXTERNAL TABLE myexternal-table
  WITH CONNECTION `myproject.us.myconnection`
  OPTIONS (
         format = 'ICEBERG',
         uris = ["gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json"]
   )

Remplacez la valeur uris par le dernier fichier de métadonnées JSON pour un instantané de table spécifique.

Vous pouvez activer l'option Demander un filtre de partitionnement en définissant l'indicateur require_partition_filter.

bq

Dans un environnement de ligne de commande, exécutez la commande bq mk --table avec le décorateur @connection pour spécifier la connexion à utiliser à la fin du paramètre --external_table_definition : Pour activer le filtre de partitionnement obligatoire, utilisez --require_partition_filter.

bq mk 
--table
--external_table_definition=TABLE_FORMAT=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID
PROJECT_ID:DATASET.EXTERNAL_TABLE

Remplacez les éléments suivants :

  • TABLE_FORMAT : nom de la table que vous souhaitez créer

    Dans ce cas, ICEBERG.

  • URI : dernier fichier de métadonnées JSON pour un instantané de table spécifique

    Par exemple, gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    L'URI peut également pointer vers un emplacement cloud externe, tel qu'Amazon S3 ou Azure Blob Storage.

    • Exemple pour AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Exemple pour Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: projet contenant la connexion permettant de créer la table Iceberg en lecture seule, par exemple myproject

  • CONNECTION_REGION: région contenant la connexion permettant de créer la table Iceberg en lecture seule, par exemple us

  • CONNECTION_ID : ID de connexion de la table, par exemple myconnection

    Lorsque vous affichez les détails de la connexion dans la console Trusted Cloud , l'ID de connexion correspond à la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple, projects/myproject/locations/connection_location/connections/myconnection).

  • DATASET : nom de l'ensemble de données BigQuery dans lequel vous souhaitez créer une table

    Par exemple, mydataset.

  • EXTERNAL_TABLE : nom de la table que vous souhaitez créer

    Par exemple, mytable.

Mettre à jour les métadonnées d'une table

Si vous utilisez un fichier de métadonnées JSON pour créer une table Iceberg en lecture seule, mettez à jour la définition de la table avec les dernières métadonnées de la table. Pour mettre à jour le schéma ou le fichier de métadonnées, sélectionnez l'une des options suivantes:

bq

  1. Créer un fichier de définition de table :

    bq mkdef --source_format=ICEBERG \
    "URI" > TABLE_DEFINITION_FILE
    
  2. Exécutez la commande bq update avec l'option --autodetect_schema :

    bq update --autodetect_schema --external_table_definition=TABLE_DEFINITION_FILE
    PROJECT_ID:DATASET.TABLE
    

    Remplacez les éléments suivants :

    • URI : votre URI Cloud Storage par le dernier fichier de métadonnées JSON

      Par exemple, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    • TABLE_DEFINITION_FILE : nom du fichier contenant le schéma de la table

    • PROJECT_ID : ID du projet contenant la table que vous souhaitez mettre à jour

    • DATASET : ensemble de données contenant la table que vous souhaitez mettre à jour

    • TABLE : table dont vous souhaitez prendre un instantané

API

Utilisez la méthode tables.patch avec la propriété autodetect_schema définie sur true :

PATCH https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables/TABLE?autodetect_schema=true

Remplacez les éléments suivants :

  • PROJECT_ID : ID du projet contenant la table que vous souhaitez mettre à jour
  • DATASET : ensemble de données contenant la table que vous souhaitez mettre à jour
  • TABLE : table dont vous souhaitez prendre un instantané

Dans le corps de la requête, spécifiez les valeurs mises à jour pour les champs suivants :

{
     "externalDataConfiguration": {
      "sourceFormat": "ICEBERG",
      "sourceUris": [
        "URI"
      ]
    },
    "schema": null
  }'

Remplacez URI par le dernier fichier de métadonnées Iceberg. Exemple : gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

Configurer des stratégies de contrôle d'accès

Vous pouvez contrôler l'accès aux tables en lecture seule Iceberg à l'aide de la sécurité au niveau des colonnes, de la sécurité au niveau des lignes et du masquage des données.

Mappage de données

BigQuery convertit les types de données Iceberg en types de données BigQuery, comme indiqué dans le tableau suivant :

Type de données Iceberg Type de données BigQuery
boolean BOOL
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERIC or BIG_NUMERIC depending on precision
date DATE
time TIME
timestamp DATETIME
timestamptz TIMESTAMP
string STRING
uuid BYTES
fixed(L) BYTES
binary BYTES
list<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

Limites

Les tables en lecture seule Iceberg sont soumises aux limites des tables externes et aux limites suivantes:

  • Les tables utilisant la fusion lors de la lecture présentent les limites suivantes:

    • Chaque fichier de données peut être associé à 10 000 fichiers de suppression maximum.
    • Vous ne pouvez pas appliquer plus de 100 000 ID d'égalité à un fichier de suppression.
    • Vous pouvez contourner ces limites en compactant fréquemment les fichiers de suppression ou en créant une vue au-dessus du tableau Iceberg qui évite les partitions fréquemment mutées.
  • BigQuery accepte l'élagage des fichiers manifestes à l'aide de toutes les fonctions de transformation de partition Iceberg, à l'exception de Bucket. Pour en savoir plus sur l'élimination des partitions, consultez la section Interroger des tables partitionnées. Les requêtes faisant référence à des tables Iceberg en lecture seule doivent contenir des littéraux dans les prédicats par rapport aux colonnes partitionnées.

  • Seuls les fichiers de données Apache Parquet sont acceptés.

Coûts de fusion lors de la lecture

La facturation à la demande pour les données de fusion lors de la lecture correspond à la somme des analyses des données suivantes:

  • Tous les octets logiques lus dans le fichier de données (y compris les lignes marquées comme supprimées par position et les suppressions d'égalité).
  • Les octets logiques lus lors du chargement de la suppression d'égalité et de la position suppriment les fichiers pour trouver les lignes supprimées dans un fichier de données.

Demander un filtre de partitionnement

Vous pouvez exiger l'utilisation de filtres de prédicat en activant l'option Demander un filtre de partitionnement pour votre table Iceberg. Si vous activez cette option, toute tentative d'interrogation de la table sans spécifier de clause WHERE alignée sur chaque fichier manifeste génère l'erreur suivante :

Cannot query over table project_id.dataset.table without a
filter that can be used for partition elimination.

Chaque fichier manifeste nécessite au moins un prédicat adapté à l'élimination de partitions.

Vous pouvez activer require_partition_filter de différentes manières lors de la création d'une table Iceberg :

SQL

Utilisez l'instruction CREATE EXTERNAL TABLE.L'exemple suivant crée une table Iceberg en lecture seule nommée TABLE avec l'option "Demander un filtre de partitionnement" activée:

  CREATE EXTERNAL TABLE TABLE
  WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
  OPTIONS (
         format = 'ICEBERG',
         uris = [URI],
         require_partition_filter = true
   )

Remplacez les éléments suivants :

  • TABLE : nom de la table que vous souhaitez créer.
  • PROJECT_ID : ID du projet contenant la table que vous souhaitez créer
  • REGION : emplacement dans lequel vous souhaitez créer la table Iceberg
  • CONNECTION_ID : ID de connexion Par exemple, myconnection.

  • URI : votre URI Cloud Storage avec le dernier fichier de métadonnées JSON

    Par exemple, gs://mybucket/us/iceberg/mytable/metadata/1234.metadata.json.

    L'URI peut également pointer vers un emplacement cloud externe, tel qu'Amazon S3 ou Azure Blob Storage.

    • Exemple pour AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Exemple pour Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.

bq

Utilisez la commande bq mk --table avec le décorateur @connection pour spécifier la connexion à utiliser à la fin du paramètre --external_table_definition. Utilisez --require_partition_filter pour activer le filtre de partitionnement obligatoire. L'exemple suivant crée une table Iceberg en lecture seule nommée TABLE avec l'option "Demander un filtre de partitionnement" activée:

bq mk \
    --table \
    --external_table_definition=ICEBERG=URI@projects/CONNECTION_PROJECT_ID/locations/CONNECTION_REGION/connections/CONNECTION_ID \
    PROJECT_ID:DATASET.EXTERNAL_TABLE \
    --require_partition_filter

Remplacez les éléments suivants :

  • URI : dernier fichier de métadonnées JSON pour un instantané de table spécifique

    Par exemple, gs://mybucket/mydata/mytable/metadata/iceberg.metadata.json.

    L'URI peut également pointer vers un emplacement cloud externe, tel qu'Amazon S3 ou Azure Blob Storage.

    • Exemple pour AWS: s3://mybucket/iceberg/metadata/1234.metadata.json.
    • Exemple pour Azure: azure://mystorageaccount.blob.core.windows.net/mycontainer/iceberg/metadata/1234.metadata.json.
  • CONNECTION_PROJECT_ID: projet contenant la connexion permettant de créer la table Iceberg en lecture seule (par exemple, myproject)

  • CONNECTION_REGION: région contenant la connexion permettant de créer la table Iceberg en lecture seule. Par exemple, us.

  • CONNECTION_ID : ID de connexion Par exemple, myconnection.

    Lorsque vous affichez les détails de la connexion dans la console Trusted Cloud , l'ID de connexion correspond à la valeur de la dernière section de l'ID de connexion complet affiché dans ID de connexion (par exemple, projects/myproject/locations/connection_location/connections/myconnection).

  • DATASET : nom de

    l'ensemble de données BigQuery contenant la table que vous souhaitez mettre à jour. Par exemple, mydataset.

  • EXTERNAL_TABLE : nom de la table que vous souhaitez créer

    Par exemple, mytable.

Vous pouvez également mettre à jour votre table Iceberg pour activer l'option "Demander un filtre de partitionnement".

Si vous n'activez pas l'option Demander un filtre de partitionnement lorsque vous créez la table partitionnée, vous pouvez mettre la table à jour pour ajouter l'option.

bq

Utilisez la commande bq update et saisissez l'option --require_partition_filter.

Par exemple :

Pour mettre à jour mypartitionedtable dans l'ensemble de données mydataset de votre projet par défaut, saisissez :

bq update --require_partition_filter PROJECT_ID:DATASET.TABLE

Étapes suivantes