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
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
-
Enable the BigQuery Connection and BigQuery Reservation APIs.
-
In the Google Cloud console, activate Cloud Shell.
Assurez-vous de disposer d'un ensemble de données BigQuery.
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.
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:
Assurez-vous d'utiliser des tables BigLake Delta Lake (avec une connexion).
Les utilisateurs disposent de l'autorisation requise décrite.
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 surtrue
.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.