Créer des tables externes BigLake pour Delta Lake

BigLake vous permet d'accéder aux tables Delta Lake avec un contrôle des accès plus précis. Delta Lake est un format de stockage de données tabulaire Open Source développé par Databricks et compatible avec les tables de données à l'échelle du pétaoctet.

BigQuery est compatible avec les fonctionnalités de tables Delta Lake suivantes :

  • Délégation d'accès : interrogez des données structurées dans des datastores externes avec la délégation d'accès. La délégation d'accès dissocie l'accès à la table Delta Lake de l'accès au datastore sous-jacent.
  • Contrôle précis des accès  appliquez une sécurité précise au niveau de la table, y compris au niveau des lignes et au niveau des colonnes. Pour les tables Delta Lake basées sur Cloud Storage, vous pouvez également utiliser le masquage des données dynamiques.
  • Évolution du schéma : les modifications de schéma dans les tables Delta Lake sont détectées automatiquement. Les modifications apportées au schéma sont reflétées dans la table BigQuery.

Les tables Delta Lake sont également compatibles avec toutes les fonctionnalités BigLake lorsque vous les configurez en tant que tables BigLake.

Avant de commencer

  1. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  2. Make sure that billing is enabled for your Google Cloud project.

  3. Enable the BigQuery Connection and BigQuery Reservation APIs.

    Enable the APIs

  4. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

  5. Assurez-vous de disposer d'un ensemble de données BigQuery.

  6. Assurez-vous que votre version du SDK Google Cloud est 366.0.0 ou ultérieure :

    gcloud version
    

    Si nécessaire, mettez à jour le SDK Google Cloud.

  7. Créez une connexion de ressource Cloud basée sur votre source de données externe, puis accordez-lui l'accès à Cloud Storage. Si vous ne disposez pas des autorisations nécessaires pour créer une connexion, demandez à votre administrateur BigQuery de créer une connexion et de la partager avec vous.

Rôles requis

Les autorisations suivantes sont requises pour créer une table Delta Lake :

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

Le rôle IAM prédéfini Administrateur BigQuery (roles/bigquery.admin) inclut ces autorisations.

Si vous n'êtes pas un compte principal dans ce rôle, demandez à votre administrateur de vous accorder ces autorisations ou de créer la table Delta Lake pour vous.

En outre, pour permettre aux utilisateurs BigQuery d'interroger la table, le compte de service associé à la connexion doit disposer de l'autorisation et de l'accès suivants :

  • Rôle de lecteur BigQuery (roles/bigquery.viewer).
  • Rôle Utilisateur de connexion BigQuery (roles/bigquery.connectionUser)
  • Accès au bucket Cloud Storage contenant ces données

Pour en savoir plus sur les rôles et les autorisations Identity and Access Management dans BigQuery, consultez la page Rôles et autorisations prédéfinis.

Créer des tables avec Delta Lake

Pour créer des tables Delta Lake, procédez comme suit.

SQL

Utilisez l'instruction CREATE EXTERNAL TABLE pour créer la table Delta Lake :

CREATE EXTERNAL TABLE `PROJECT_ID.DATASET.DELTALAKE_TABLE_NAME`
WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
OPTIONS (
  format ="DELTA_LAKE",
  uris=['DELTA_TABLE_GCS_BASE_PATH']);

Remplacez les valeurs suivantes :

  • PROJECT_ID : ID du projet dans lequel vous souhaitez créer la table Delta Lake
  • DATASET : ensemble de données BigQuery contenant la table Delta Lake
  • DELTALAKE_TABLE_NAME : nom de votre table Delta Lake
  • REGION : région contenant la connexion permettant de créer la table Delta Lake, par exemple us
  • CONNECTION_ID : ID de connexion, par exemple myconnection.

    Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de 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.

  • DELTA_TABLE_GCS_BASE_PATH : préfixe de la table Delta Lake

bq

Dans un environnement de ligne de commande, utilisez la commande bq mk pour créer la table Delta Lake :

bq mk --table --external_table_definition=DEFINITION_FILE PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

Remplacez les valeurs suivantes :

  • DEFINITION_FILE : chemin d'accès au fichier de définition de table.
  • PROJECT_ID : ID du projet dans lequel vous souhaitez créer la table Delta Lake
  • DATASET : ensemble de données BigQuery contenant la table Delta Lake
  • DELTALAKE_TABLE_NAME : nom de votre table Delta Lake

REST

Utilisez l'API BigQuery pour créer une table Delta Lake en appelant la méthode API tables.insert :

REQUEST='{
  "autodetect": true,
  "externalDataConfiguration": {
  "sourceFormat": "DELTA_LAKE",
  "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
  "sourceUris": [
    "DELTA_TABLE_GCS_BASE_PATH"
  ],
 },
"tableReference": {
"tableId": "DELTALAKE_TABLE_NAME"
}
}'

echo $REQUEST | curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables?autodetect_schema=true

Remplacez les valeurs suivantes :

  • PROJECT_ID : ID du projet dans lequel vous souhaitez créer la table Delta Lake
  • REGION : région contenant la connexion permettant de créer la table Delta Lake, par exemple us
  • CONNECTION_ID : ID de connexion, par exemple myconnection.

    Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de 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.

  • DELTA_TABLE_GCS_BASE_PATH : préfixe de la table Delta Lake

  • DELTALAKE_TABLE_NAME : nom de votre table Delta Lake

  • DATASET : ensemble de données BigQuery contenant la table Delta Lake

Lorsque vous créez des tables Delta Lake, le préfixe Delta Lake est utilisé comme URI de la table. Par exemple, pour une table qui contient des journaux dans le bucket gs://bucket/warehouse/basictable/_delta_log, l'URI de la table est gs://bucket/warehouse/basictable. Lorsque vous exécutez des requêtes sur la table Delta Lake, BigQuery lit les données associées à ce préfixe pour identifier la version actuelle de la table, puis calcule les métadonnées et les fichiers de la table.

Bien que vous puissiez créer des tables externes Delta Lake sans connexion, nous vous déconseillons de le faire pour les raisons suivantes:

  • Les utilisateurs peuvent rencontrer des erreurs ACCESS_DENIED lorsqu'ils tentent d'accéder à des fichiers sur Cloud Storage.
  • Les fonctionnalités telles que le contrôle précis des accès ne sont disponibles que dans les tables BigLake Delta Lake.

Mettre à jour des tables Delta Lake

Pour mettre à jour (actualiser) le schéma des tables Delta Lake, procédez comme suit.

bq

Dans un environnement de ligne de commande, utilisez la commande bq update pour mettre à jour (actualiser) le schéma de la table Delta Lake :

bq update --autodetect_schema PROJECT_ID:DATASET.DELTALAKE_TABLE_NAME

Remplacez les valeurs suivantes :

  • PROJECT_ID : ID du projet dans lequel vous souhaitez créer la table Delta Lake
  • DATASET : ensemble de données BigQuery contenant la table Delta Lake
  • DELTALAKE_TABLE_NAME : nom de votre table Delta Lake

REST

Utilisez l'API BigQuery pour mettre à jour une table Delta Lake en appelant la méthode API tables.patch :

REQUEST='{
  "externalDataConfiguration": {
    "sourceFormat": "DELTA_LAKE",
    "sourceUris": [
      "DELTA_TABLE_GCS_BASE_PATH"
    ],
    "connectionId": "PROJECT_ID.REGION.CONNECTION_ID",
    "autodetect": true
  },
  "tableReference": {
    "tableId": "DELTALAKE_TABLE_NAME"
  }
}'
echo $REQUEST |curl -X POST -d @- -H "Content-Type: application/json" -H "Authorization: Bearer $(gcloud auth print-access-token)" https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT_ID/datasets/DATASET/tables

Remplacez les valeurs suivantes :

  • DELTA_TABLE_GCS_BASE_PATH : préfixe de la table Delta Lake
  • PROJECT_ID : ID du projet dans lequel vous souhaitez créer la table Delta Lake
  • REGION : région contenant la connexion permettant de créer la table Delta Lake, par exemple us
  • CONNECTION_ID : ID de connexion, par exemple myconnection.

    Lorsque vous affichez les détails de la connexion dans la console Google Cloud, il s'agit de 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.

  • DELTALAKE_TABLE_NAME : nom de votre table Delta Lake

  • DATASET : ensemble de données BigQuery contenant la table Delta Lake

Interroger des tables Delta Lake

Après avoir créé une table BigLake Delta Lake, vous pouvez l'interroger à l'aide d'une syntaxe GoogleSQL, comme vous le feriez pour une table BigQuery standard. Exemple :

SELECT field1, field2 FROM mydataset.my_cloud_storage_table;

Pour en savoir plus, consultez la section Interroger des données Cloud Storage dans des tables BigLake.

Une connexion externe associée à un compte de service permet de se connecter au data store. Comme le compte de service récupère les données du data store, les utilisateurs n'ont besoin que d'accéder à la table Delta Lake.

Mappage de données

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

Type Delta Lake Type BigQuery
boolean BOOL
byte INT64
int INT64
long INT64
float FLOAT64
double FLOAT64
Decimal(P/S) NUMERIC ou BIG_NUMERIC selon la précision
date DATE
time TIME
timestamp (not partition column) TIMESTAMP
timestamp (partition column) DATETIME
string STRING
binary BYTES
array<Type> ARRAY<Type>
struct STRUCT
map<KeyType, ValueType> ARRAY<Struct<key KeyType, value ValueType>>

Limites

Les tables Delta Lake présentent des limites de table BigLake, ainsi que les limites suivantes :

  • Compatibilité avec la version 3 du lecteur Delta Lake avec des vecteurs de suppression et un mappage de colonnes.
  • Les points de contrôle Delta Lake V2 ne sont pas acceptés.
  • Vous devez répertorier la version du lecteur dans le fichier d'entrée de la dernière entrée de journal. Par exemple, les nouvelles tables doivent inclure 00000..0.json.
  • Les opérations de capture de données modifiées (CDC, Change Data Capture) ne sont pas acceptées. Toutes les opérations CDC existantes sont ignorées.
  • Le schéma est détecté automatiquement. Il n'est pas possible de modifier le schéma à l'aide de BigQuery.
  • Les noms de colonne de table doivent respecter les restrictions sur les noms de colonnes de BigQuery.
  • Les vues matérialisées ne sont pas acceptées.
  • L'API Read n'est pas compatible avec Delta Lake.

Dépannage

Cette section fournit de l'aide sur les tables BigLake Delta Lake. Pour obtenir de l'aide plus générale sur le dépannage des requêtes BigQuery, consultez Résoudre les problèmes de requête.

Erreurs d'expiration de requête et de ressources

Vérifiez le répertoire des journaux (gs://bucket/warehouse/basictable/_delta_log) de la table Delta Lake et recherchez les fichiers JSON dont le numéro de version est supérieur au point de contrôle précédent. Vous pouvez obtenir le numéro de version en listant le répertoire ou en inspectant le fichier _delta_log/_last_checkpoint. Les fichiers JSON de plus de 10 Mo peuvent ralentir l'expansion des tables, ce qui peut entraîner des problèmes de délai avant expiration et de ressources. Pour résoudre ce problème, utilisez la commande suivante pour créer un point de contrôle afin que les requêtes ignorent la lecture des fichiers JSON:

  spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.checkpointInterval' = '1')");

Les utilisateurs peuvent ensuite utiliser la même commande pour réinitialiser l'intervalle de point de contrôle sur la valeur par défaut de 10 ou sur une valeur qui évite d'avoir plus de 50 Mo de fichiers JSON entre les points de contrôle.

Nom de colonne non valide

Assurez-vous que le mappage de colonnes est activé pour la table Delta Lake. La mise en correspondance des colonnes est compatible avec la version 2 ou ultérieure de Reader. Pour la version 1 de Reader, définissez "delta.columnMapping.mode" sur "name" à l'aide de la commande suivante:

spark.sql("ALTER TABLE delta.`gs://bucket/mydeltatabledir` SET TBLPROPERTIES ('delta.columnMapping.mode' = 'name', 'delta.minReaderVersion' = '3', 'delta.minWriterVersion' = '7')");

Si le nom de colonne non valide respecte les restrictions flexibles sur les noms de colonnes, contactez l'assistance client Cloud ou biglake-help@google.com.

Erreurs d'accès refusé

Pour diagnostiquer les problèmes liés aux tables BigLake Delta Lake, vérifiez les points suivants:

Performance

Pour améliorer les performances des requêtes, procédez comme suit:

  • Utilisez les utilitaires Delta Lake pour compacter les fichiers de données sous-jacents et supprimer les fichiers redondants, tels que les données et les métadonnées.

  • Assurez-vous que delta.checkpoint.writeStatsAsStruct est défini sur true.

  • Assurez-vous que les variables fréquemment utilisées dans les clauses de prédicat se trouvent dans les colonnes de partitionnement.

Les ensembles de données volumineux (supérieurs à 100 To) peuvent bénéficier de configurations et de fonctionnalités supplémentaires. Si les étapes précédentes ne résolvent pas vos problèmes, envisagez de contacter l'assistance client ou biglake-help@google.com, en particulier pour les ensembles de données de plus de 100 To.