Gérer des tables

Ce document explique comment gérer les tables dans BigQuery. Vous pouvez gérer vos tables BigQuery comme suit :

  • Mettre à jour une table :
    • Date/Heure d'expiration
    • Description
    • Définition du schéma
    • Libellés
  • Renommer (copier) une table
  • Copier une table
  • Supprimer une table
  • Restaurer une table supprimée

Pour plus d'informations sur la création et l'utilisation des tables, y compris sur la collecte des informations dans les tables, la liste des tables et le contrôle de l'accès aux données des tables, consultez la section Créer et utiliser des tables.

Mettre à jour les propriétés d'une table

Vous pouvez mettre à jour les propriétés d'une table :

Autorisations requises

Pour mettre à jour une table, vous devez au minimum disposer des autorisations bigquery.tables.update et bigquery.tables.get. Les rôles Cloud IAM prédéfinis suivants incluent les autorisations bigquery.tables.update et bigquery.tables.get :

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

En outre, si un utilisateur possède les autorisations bigquery.datasets.create, il obtient également un accès bigquery.dataOwner à l'ensemble de données qu'il crée. L'accès bigquery.dataOwner permet à l'utilisateur de mettre à jour les propriétés des tables dans les ensembles de données qu'il crée.

Pour en savoir plus sur les rôles et les autorisations Cloud IAM dans BigQuery, consultez la page Rôles et autorisations prédéfinis.

Mettre à jour la description d'une table

Vous pouvez mettre à jour la description d'une table à l'aide des méthodes suivantes :

  • En utilisant Cloud Console ou l'UI Web classique de BigQuery
  • En utilisant une instruction LDD ALTER TABLE
  • En exécutant la commande de l'interface de ligne de commande bq update
  • appeler la méthode API tables.patch ;
  • En utilisant les bibliothèques clientes.

Pour mettre à jour la description d'une table :

Console

Vous ne pouvez pas ajouter de description lorsque vous créez une table à l'aide de la Cloud Console. Une fois la table créée, vous pouvez ajouter une description sur la page Details (Détails).

  1. Dans le volet Ressources, sélectionnez la table.

  2. Sous l'éditeur de requête, cliquez sur Details (Détails).

    Modifiez le schéma de la table.

  3. Dans la section Description, cliquez sur l'icône en forme de crayon pour modifier la description

    Modifiez la description.

  4. Saisissez une description dans la zone de texte, puis cliquez sur Mettre à jour pour enregistrer.

LDD

Les instructions LDD (langage de définition de données) vous permettent de créer et de modifier des tables et des vues à l'aide de la syntaxe de requête SQL standard.

En savoir plus sur l'utilisation des instructions de langage de définition de données

Pour mettre à jour la description d'une table à l'aide d'une instruction LDD dans Cloud Console, procédez comme suit :

  1. Cliquez sur Compose new query (Saisir une nouvelle requête).

  2. Saisissez votre instruction LDD dans la zone de texte de l'éditeur de requête.

     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       description="Description of mytable"
     )
     

  3. Cliquez sur Exécuter (Run).

UI classique

  1. Dans le volet de navigation, sélectionnez la table.

  2. Sur la page Table Details (Détails de la table), cliquez sur Details (Détails).

  3. Dans la section Description, cliquez sur Describe this table (Décrire cette table) pour ouvrir la zone de description.

  4. Entrez une description dans la zone. Cliquez en dehors de la zone pour enregistrer le texte.

    Description de la table.

bq

Exécutez la commande bq update avec l'option --description. Si vous mettez à jour une table dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données en respectant le format suivant : project_id:dataset.

bq update \
--description "description" \
project_id:dataset.table

Remplacez l'élément suivant :

  • description : texte décrivant la table entre guillemets.
  • project_id : ID de votre projet.
  • dataset : nom de l'ensemble de données contenant la table que vous mettez à jour.
  • table : nom de la table que vous mettez à jour.

Exemples :

Saisissez la commande suivante pour remplacer la description de mytable dans mydataset par "Description of mytable". mydataset se trouve dans votre projet par défaut.

bq update --description "Description of mytable" mydataset.mytable

Saisissez la commande suivante pour remplacer la description de mytable dans mydataset par "Description of mytable". mydataset se trouve dans myotherproject, et non dans votre projet par défaut.

bq update \
--description "Description of mytable" \
myotherproject:mydataset.mytable

API

Appelez la méthode tables.patch et utilisez la propriété description dans la ressource de table pour mettre à jour la description de la table. Étant donné que la méthode tables.update remplace l'intégralité de la ressource de table, la méthode tables.patch est préférable.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API BigQuery en langage Go.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateTableDescription demonstrates how to fetch a table's metadata and updates the Description metadata.
func updateTableDescription(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		Description: "Updated description.",
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API BigQuery en langage Java.

// String datasetName = "my_dataset_name";
// String tableName = "my_table_name";
// String newDescription = "new_description";

Table beforeTable = bigquery.getTable(datasetName, tableName);
TableInfo tableInfo = beforeTable.toBuilder()
    .setDescription(newDescription)
    .build();
Table afterTable = bigquery.update(tableInfo);

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Python.

Configurez la propriété Table.description et appelez Client.update_table() pour envoyer la mise à jour à l'API.

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == "Original description."
table.description = "Updated description."

table = client.update_table(table, ["description"])  # API request

assert table.description == "Updated description."

Mettre à jour la date/heure d'expiration d'une table

Vous pouvez définir une date/heure d'expiration de la table par défaut au niveau de l'ensemble de données ou définir la date/heure d'expiration d'une table lors de sa création. La date/heure d'expiration d'une table est souvent appelée "time to live" (durée de vie) ou valeur TTL.

Si vous définissez le délai d'expiration lorsque vous créez la table, la valeur TTL par défaut de l'ensemble de données est ignorée. Si vous ne définissez pas de délai d'expiration de table par défaut au niveau de l'ensemble de données et que vous n'en définissez pas lors de sa création, la table n'expire jamais, et vous devez la supprimer manuellement.

À tout moment après la création de la table, vous pouvez mettre à jour le délai d'expiration à l'aide des méthodes suivantes :

  • En utilisant Cloud Console ou l'UI Web classique de BigQuery
  • En utilisant une instruction LDD ALTER TABLE
  • En utilisant la commande bq update de l'interface de ligne de commande
  • appeler la méthode API tables.patch ;
  • En utilisant les bibliothèques clientes.

Pour mettre à jour la date/heure d'expiration d'une table :

Console

Vous ne pouvez pas ajouter de délai d'expiration lorsque vous créez une table à l'aide de Cloud Console. Une fois la table créée, vous pouvez ajouter ou mettre à jour le délai d'expiration de la table sur la page Détails de la table.

  1. Dans le volet Ressources, sélectionnez la table.

  2. Sous l'éditeur de requête, cliquez sur Details (Détails).

  3. Cliquez sur l'icône en forme de crayon à côté des Table info (Informations sur la table).

  4. Pour Table expiration (Expiration de la table), sélectionnez Specify date (Spécifier une date). Sélectionnez ensuite la date d'expiration à l'aide du widget Agenda.

  5. Cliquez sur Update (Mettre à jour) pour enregistrer la modification. Le délai d'expiration mis à jour apparaît dans la section Table info (Informations sur la table).

LDD

Les instructions LDD (langage de définition de données) vous permettent de créer et de modifier des tables et des vues à l'aide de la syntaxe de requête SQL standard.

En savoir plus sur l'utilisation des instructions de langage de définition de données

Pour mettre à jour le délai d'expiration à l'aide d'une instruction LDD dans Cloud Console, procédez comme suit :

  1. Cliquez sur Compose new query (Saisir une nouvelle requête).

  2. Saisissez votre instruction LDD dans la zone de texte de l'éditeur de requête.

     ALTER TABLE mydataset.mytable
     SET OPTIONS (
       -- Sets table expiration to timestamp 2025-02-03 12:34:56
       expiration_timestamp=TIMESTAMP "2025-02-03 12:34:56"
     )
     

  3. Cliquez sur Exécuter (Run).

UI classique

  1. Dans le volet de navigation, sélectionnez la table.

  2. Sur la page Table Details (Détails de la table), cliquez sur Details (Détails).

  3. Pour le champ Expiration Time (Date/heure d'expiration), cliquez sur Edit (Modifier).

  4. Dans la boîte de dialogue Update Expiration (Mettre à jour le délai d'expiration), cliquez sur In (Dans) et saisissez un délai d'expiration en jours.

  5. Cliquez sur OK. Le délai d'expiration mis à jour apparaît sur la page Details (Détails).

    Expiration de la table.

bq

Exécutez la commande bq update avec l'option --expiration. Si vous mettez à jour une table dans un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données en respectant le format suivant : project_id:dataset.

bq update \
--expiration integer \
project_id:dataset.table

Remplacez l'élément suivant :

  • integer : durée de vie par défaut (en secondes) de la table. La valeur minimale est de 3 600 secondes (une heure). Le délai d'expiration correspond à l'heure actuelle plus la valeur entière. Si vous spécifiez 0, le délai d'expiration de la table est supprimé, et la table n'expire jamais. Les tables sans délai d'expiration doivent être supprimées manuellement.
  • project_id : ID de votre projet.
  • dataset : nom de l'ensemble de données contenant la table que vous mettez à jour.
  • table : nom de la table que vous mettez à jour.

Exemples :

Saisissez la commande suivante pour faire passer le délai d'expiration de mytable dans mydataset à cinq jours (432 000 secondes). mydataset se trouve dans votre projet par défaut.

bq update --expiration 432000 mydataset.mytable

Saisissez la commande suivante pour faire passer le délai d'expiration de mytable dans mydataset à cinq jours (432 000 secondes). mydataset se trouve dans myotherproject, et non dans votre projet par défaut.

bq update --expiration 432000 myotherproject:mydataset.mytable

API

Appelez la méthode tables.patch et utilisez la propriété expirationTime dans la ressource de table pour mettre à jour le délai d'expiration de la table (en millisecondes). Étant donné que la méthode tables.update remplace l'intégralité de la ressource de table, la méthode tables.patch est préférable.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API BigQuery en langage Go.

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// updateTableExpiration demonstrates setting the table expiration of a table to a specific point in time
// in the future, at which time it will be deleted.
func updateTableExpiration(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API BigQuery en langage Java.

Table beforeTable = bigquery.getTable(datasetName, tableName);

// Set table to expire 5 days from now.
long expirationMillis = DateTime.now().plusDays(5).getMillis();
TableInfo tableInfo = beforeTable.toBuilder()
        .setExpirationTime(expirationMillis)
        .build();
Table afterTable = bigquery.update(tableInfo);

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Python.

Configurez la propriété Table.expires et appelez Client.update_table() pour envoyer la mise à jour à l'API.

import datetime
import pytz

# from google.cloud import bigquery
# client = bigquery.Client()
# table_ref = client.dataset('my_dataset').table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.expires is None

# set table to expire 5 days from now
expiration = datetime.datetime.now(pytz.utc) + datetime.timedelta(days=5)
table.expires = expiration
table = client.update_table(table, ["expires"])  # API request

# expiration is stored in milliseconds
margin = datetime.timedelta(microseconds=1000)
assert expiration - margin <= table.expires <= expiration + margin

Mettre à jour la définition d'un schéma de table

Pour plus d'informations sur la mise à jour de la définition d'un schéma de table, consultez Modifier des schémas de table.

Renommer une table

Vous ne pouvez pas modifier le nom d'une table existante. Si vous devez modifier le nom de la table, suivez les étapes pour copier la table. Lorsque vous spécifiez la table de destination dans l'opération de copie, indiquez le nouveau nom de table.

Copier une table

Vous pouvez copier une table des manières suivantes :

  • En utilisant Cloud Console ou l'UI Web classique de BigQuery
  • En utilisant la commande bq cp de l'outil de ligne de commande
  • En appelant la méthode API jobs.insert et en configurant une tâche de copie (copy)
  • En utilisant les bibliothèques clientes.

Autorisations requises

Pour copier des tables et des partitions, vous devez au minimum disposer des autorisations ci-dessous.

Sur l'ensemble de données source :

  • bigquery.tables.get
  • bigquery.tables.getData

Sur l'ensemble de données de destination :

  • bigquery.tables.create pour créer la copie de la table ou de la partition dans l'ensemble de données de destination

Les rôles Cloud IAM prédéfinis suivants incluent les autorisations bigquery.tables.create, bigquery.tables.get et bigquery.tables.getData :

  • bigquery.dataEditor
  • bigquery.dataOwner
  • bigquery.admin

En outre, pour exécuter la tâche de copie, vous devez disposer des autorisations bigquery.jobs.create.

Les rôles Cloud IAM prédéfinis suivants incluent les autorisations bigquery.jobs.create :

  • bigquery.user
  • bigquery.jobUser
  • bigquery.admin

En outre, si un utilisateur possède les autorisations bigquery.datasets.create, il obtient également un accès bigquery.dataOwner à l'ensemble de données qu'il crée. L'accès bigquery.dataOwner permet à l'utilisateur de copier des tables et des partitions dans l'ensemble de données, mais l'accès à l'ensemble de données de destination est requis sauf si l'utilisateur l'a également créé.

Pour en savoir plus sur les rôles et les autorisations Cloud IAM dans BigQuery, consultez la page Rôles et autorisations prédéfinis.

Limites de la copie de tables

Les tâches de copie de tables sont soumises aux limites suivantes :

  • Lorsque vous copiez une table, le nom de la table de destination doit respecter les mêmes conventions d'attribution de noms que lorsque vous créez une table.
  • Les copies de tables sont soumises aux règles de quota de BigQuery sur les tâches de copie.
  • Lorsque vous utilisez Cloud Console ou l'UI Web classique de BigQuery pour copier une table, vous ne pouvez pas écraser une table existante dans l'ensemble de données de destination. La table doit avoir un nom unique dans l'ensemble de données de destination.
  • Lorsque vous copiez des tables, l'ensemble de données de destination doit se trouver dans le même emplacement que l'ensemble de données contenant la table à copier. Par exemple, vous ne pouvez pas copier une table à partir d'un ensemble de données basé au sein de l'UE et l'écrire dans un ensemble de données basé aux États-Unis.
  • Vous ne pouvez pas copier plusieurs tables sources dans une table de destination avec Cloud Console ou l'UI Web classique de BigQuery.
  • Lors de la copie de plusieurs tables sources vers une table de destination à l'aide de l'interface de ligne de commande ou de l'API, toutes les tables sources doivent contenir des schémas identiques.

Copier une seule table source

Vous pouvez copier une seule table à l'aide des méthodes suivantes :

  • En utilisant Cloud Console ou l'UI Web classique de BigQuery
  • En utilisant la commande bq cp de l'outil de ligne de commande
  • En appelant la méthode API jobs.insert, en configurant une tâche de copie (copy) et en spécifiant la propriété sourceTable
  • En utilisant les bibliothèques clientes.

Cloud Console et l'UI Web classique de BigQuery n'acceptent qu'une table source et une table de destination dans une tâche de copie. Pour copier plusieurs fichiers sources dans une table de destination, vous devez utiliser l'outil de ligne de commande ou l'API.

Pour copier une seule table source, procédez comme suit :

Console

  1. Sélectionnez la table que vous souhaitez copier dans le panneau Ressources.

  2. Sous l'éditeur de requête, cliquez sur Copy table (Copier la table).

  3. Dans la boîte de dialogue Copier la table, sous Destination :

    • Pour Project name (Nom du projet), choisissez le projet qui hébergera la table copiée.
    • Pour Dataset name (Nom de l'ensemble de données), sélectionnez l'ensemble de données dans lequel vous souhaitez stocker la table copiée. Les ensembles de données source et de destination doivent être stockés dans le même emplacement.
    • Pour Table name (Nom de la table), saisissez un nom pour la nouvelle table. Le nom doit être unique dans l'ensemble de données de destination. Le nom de la table peut contenir jusqu'à 1 024 caractères et uniquement les caractères de a à z, A à Z, 0 à 9 ou _ (le trait de soulignement). Vous ne pouvez pas écraser une table existante dans l'ensemble de données de destination à l'aide de Cloud Console.
  4. Cliquez sur Copy (Copier) pour démarrer la tâche de copie.

UI classique

  1. Cliquez sur l'icône du menu d'affichage flèche vers le bas située à côté de la table que vous souhaitez copier, puis sur Copy Table (Copier la table).

  2. Dans la boîte de dialogue Copy Table (Copier la table) :

    • Pour le champ Destination Project (Projet de destination), choisissez le projet dans lequel la table sera stockée.
    • Pour le champ Destination dataset (Ensemble de données de destination), sélectionnez l'ensemble de données dans lequel vous souhaitez stocker la table copiée. Les ensembles de données source et de destination doivent être stockés au même emplacement.
    • Pour Destination Table (Table de destination), saisissez un nom pour la nouvelle table. Le nom doit être unique dans l'ensemble de données de destination. Le nom de la table peut contenir jusqu'à 1 024 caractères et uniquement les caractères de a à z, A à Z, 0 à 9 ou _ (le trait de soulignement). Vous ne pouvez pas écraser une table existante dans l'ensemble de données de destination à l'aide de l'UI Web classique de BigQuery.

      Copie de table.

  3. Cliquez sur OK pour démarrer la tâche de copie.

bq

Exécutez la commande bq cp. Les indicateurs facultatifs peuvent être utilisés pour contrôler la disposition d'écriture de la table de destination :

  • -a ou --append_table ajoute les données de la table source à une table existante de l'ensemble de données de destination.
  • -f ou --force écrase une table existante dans l'ensemble de données de destination, et ne vous demande pas de confirmation.
  • -n ou --no_clobber renvoie le message d'erreur suivant si la table existe dans l'ensemble de données de destination : Table 'project_id:dataset.table' already exists, skipping. Si -n n'est pas spécifié, le comportement par défaut consiste à vous demander si vous souhaitez remplacer la table de destination.
  • --destination_kms_key est la clé Cloud KMS gérée par le client et utilisée pour chiffrer la table de destination.

--destination_kms_key n'est pas présenté ici. Pour en savoir plus, consultez la page Protéger des données avec des clés Cloud Key Management Service.

Si l'ensemble de données source ou de destination se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID du projet aux noms des ensembles de données en respectant le format suivant : project_id:dataset.

(Facultatif) Spécifiez l'option --location et définissez la valeur correspondant à votre emplacement.

bq --location=location cp \
-a -f -n \
project_id:dataset.source_table \
project_id:dataset.destination_table

Remplacez les éléments suivants :

  • location : nom de votre emplacement. L'option --location est facultative. Par exemple, si vous utilisez BigQuery dans la région de Tokyo, vous pouvez définir la valeur de l'option sur asia-northeast1. Vous pouvez définir une valeur par défaut correspondant à l'emplacement en utilisant le fichier .bigqueryrc.
  • project_id : ID de votre projet.
  • dataset : nom de l'ensemble de données source ou de destination.
  • source_table : la table que vous copiez.
  • destination_table : nom de la table dans l'ensemble de données de destination.

Exemples :

Saisissez la commande suivante pour copier mydataset.mytable dans mydataset2.mytable2. Les deux ensembles de données sont dans votre projet par défaut.

bq cp mydataset.mytable mydataset2.mytable2

Saisissez la commande suivante pour copier mydataset.mytable et pour écraser une table de destination portant le même nom. L'ensemble de données source est dans votre projet par défaut. L'ensemble de données de destination se trouve dans myotherproject. Le raccourci -f permet d'écraser la table de destination sans invite.

bq cp -f \
mydataset.mytable \
myotherproject:myotherdataset.mytable

Saisissez la commande suivante pour copier mydataset.mytable et pour renvoyer une erreur si l'ensemble de données de destination contient une table portant le même nom. L'ensemble de données source est dans votre projet par défaut. L'ensemble de données de destination se trouve dans myotherproject. Le raccourci -n permet d'éviter d'écraser une table portant le même nom.

bq cp -n \
mydataset.mytable \
myotherproject:myotherdataset.mytable

Saisissez la commande suivante pour copier mydataset.mytable et pour ajouter les données à une table de destination portant le même nom. L'ensemble de données source est dans votre projet par défaut. L'ensemble de données de destination se trouve dans myotherproject. Le raccourci - a permet d'ajouter des données à la table de destination.

bq cp -a mydataset.mytable myotherproject:myotherdataset.mytable

API

Vous pouvez copier une table existante via l'API en appelant la méthode bigquery.jobs.insert et en configurant une tâche de copie (copy). Spécifiez l'emplacement dans la propriété location de la section jobReference de la ressource de tâche.

Vous devez spécifier les valeurs suivantes dans votre configuration de tâche :

"copy": {
      "sourceTable": {       // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "destinationTable": {  // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "createDisposition": string,  // Optional
      "writeDisposition": string,   // Optional
    },

sourceTable fournit des informations sur la table à copier, destinationTable fournit des informations sur la nouvelle table, createDisposition précise si la table doit être créée si elle n'existe pas, et writeDisposition indique s'il convient d'écraser une table existante ou d'y ajouter des données.

C#

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour C# décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage C#.


using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryCopyTable
{
    public void CopyTable(
        string projectId = "your-project-id",
        string destinationDatasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        TableReference sourceTableRef = new TableReference()
        {
            TableId = "shakespeare",
            DatasetId = "samples",
            ProjectId = "bigquery-public-data"
        };
        TableReference destinationTableRef = client.GetTableReference(
            destinationDatasetId, "destination_table");
        BigQueryJob job = client.CreateCopyJob(
            sourceTableRef, destinationTableRef)
            .PollUntilCompleted();  // Wait for the job to complete.
        // Retrieve destination table
        BigQueryTable destinationTable = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Copied {destinationTable.Resource.NumRows} rows from table "
            + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
            + $"to {destinationTable.FullyQualifiedId}."
        );
    }
}

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// copyTable demonstrates copying a table from a source to a destination, and
// allowing the copy to overwrite existing data by using truncation.
func copyTable(projectID, datasetID, srcID, dstID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// srcID := "sourcetable"
	// dstID := "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	dataset := client.Dataset(datasetID)
	copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Java.

TableId destinationId = TableId.of(dataset, tableName);
JobOption options = JobOption.fields(JobField.STATUS, JobField.USER_EMAIL);
Job job = table.copy(destinationId, options);
// Wait for the job to complete.
try {
  Job completedJob =
      job.waitFor(
          RetryOption.initialRetryDelay(Duration.ofSeconds(1)),
          RetryOption.totalTimeout(Duration.ofMinutes(3)));
  if (completedJob != null && completedJob.getStatus().getError() == null) {
    // Job completed successfully.
  } else {
    // Handle error case.
  }
} catch (InterruptedException e) {
  // Handle interrupted wait
}

Node.js

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Node.js.

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function copyTable() {
  // Copies src_dataset:src_table to dest_dataset:dest_table.

  /**
   * TODO(developer): Uncomment the following lines before running the sample
   */
  // const srcDatasetId = "my_src_dataset";
  // const srcTableId = "my_src_table";
  // const destDatasetId = "my_dest_dataset";
  // const destTableId = "my_dest_table";

  // Copy the table contents into another table
  const [job] = await bigquery
    .dataset(srcDatasetId)
    .table(srcTableId)
    .copy(bigquery.dataset(destDatasetId).table(destTableId));

  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour PHP dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage PHP.

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $sourceTableId   = 'The BigQuery table ID to copy from';
// $destinationTableId = 'The BigQuery table ID to copy to';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$sourceTable = $dataset->table($sourceTableId);
$destinationTable = $dataset->table($destinationTableId);
$copyConfig = $sourceTable->copy($destinationTable);
$job = $sourceTable->runJob($copyConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Table copied successfully' . PHP_EOL);
}

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Python.


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set source_table_id to the ID of the original table.
# source_table_id = "your-project.source_dataset.source_table"

# TODO(developer): Set destination_table_id to the ID of the destination table.
# destination_table_id = "your-project.destination_dataset.destination_table"

job = client.copy_table(source_table_id, destination_table_id)
job.result()  # Wait for the job to complete.

print("A copy of the table created.")

Copier plusieurs tables sources

Vous pouvez copier plusieurs tables sources dans une table de destination à l'aide des méthodes suivantes :

  • En utilisant la commande bq cp de l'outil de ligne de commande ;
  • En appelant la méthode jobs.insert, en configurant une tâche de copie (copy) et en spécifiant la propriété sourceTables
  • En utilisant les bibliothèques clientes.

Toutes les tables sources doivent avoir des schémas identiques et une seule table de destination est autorisée.

Vous devez spécifier les tables sources sous forme de liste en les séparant par une virgule. Vous ne pouvez pas utiliser de caractères génériques lorsque vous copiez plusieurs tables sources.

Pour copier plusieurs tables sources :

Console

Actuellement, il est impossible de copier plusieurs tables à l'aide de Cloud Console.

UI classique

Actuellement, il est impossible de copier plusieurs tables à l'aide de l'UI Web classique de BigQuery.

bq

Exécutez la commande bq cp et incluez plusieurs tables sources sous forme de liste séparée par des virgules. Les indicateurs facultatifs peuvent être utilisés pour contrôler la disposition d'écriture de la table de destination :

  • -a ou --append_table ajoute les données des tables sources à une table existante de l'ensemble de données de destination.
  • -f ou --force écrase une table de destination existante dans l'ensemble de données de destination, et ne vous demande pas de confirmation.
  • -n ou --no_clobber renvoie le message d'erreur suivant si la table existe dans l'ensemble de données de destination : Table 'project_id:dataset.table' already exists, skipping. Si -n n'est pas spécifié, le comportement par défaut consiste à vous demander si vous souhaitez remplacer la table de destination.
  • --destination_kms_key est la clé Cloud Key Management Service gérée par le client et utilisée pour chiffrer la table de destination.

--destination_kms_key n'est pas présenté ici. Pour en savoir plus, consultez la page Protéger des données avec des clés Cloud Key Management Service.

Si l'ensemble de données source ou de destination se trouve dans un projet autre que votre projet par défaut, ajoutez l'ID du projet aux noms des ensembles de données en respectant le format suivant : project_id:dataset.

(Facultatif) Spécifiez l'option --location et définissez la valeur correspondant à votre emplacement.

bq --location=location cp \
-a -f -n \
project_id:dataset.source_table,project_id:dataset.source_table \
project_id:dataset.destination_table

Remplacez les éléments suivants :

  • location : nom de votre emplacement. L'option --location est facultative. Par exemple, si vous utilisez BigQuery dans la région de Tokyo, vous pouvez définir la valeur de l'option sur asia-northeast1. Vous pouvez définir une valeur par défaut correspondant à l'emplacement en utilisant le fichier .bigqueryrc.
  • project_id : ID de votre projet.
  • dataset : nom de l'ensemble de données source ou de destination.
  • source_table : la table que vous copiez.
  • destination_table : nom de la table dans l'ensemble de données de destination.

Exemples :

Saisissez la commande suivante pour copier mydataset.mytable et mydataset.mytable2 dans mydataset2.tablecopy. Tous les ensembles de données sont dans votre projet par défaut.

bq cp \
mydataset.mytable,mydataset.mytable2 \
mydataset2.tablecopy

Saisissez la commande suivante pour copier mydataset.mytable et mydataset.mytable2 dans myotherdataset.mytable, et pour écraser une table de destination portant le même nom. L'ensemble de données de destination se trouve dans myotherproject, et non dans votre projet par défaut. Le raccourci -f permet d'écraser la table de destination sans invite.

bq cp -f \
mydataset.mytable,mydataset.mytable2 \
myotherproject:myotherdataset.mytable

Saisissez la commande suivante pour copier myproject:mydataset.mytable et myproject:mydataset.mytable2, et pour renvoyer une erreur si l'ensemble de données de destination contient une table portant le même nom. L'ensemble de données de destination se trouve dans myotherproject. Le raccourci -n permet d'éviter d'écraser une table portant le même nom.

bq cp -n \
myproject:mydataset.mytable,myproject:mydataset.mytable2 \
myotherproject:myotherdataset.mytable

Saisissez la commande suivante pour copier mydataset.mytable et mydataset.mytable2, et pour ajouter les données à une table de destination portant le même nom. L'ensemble de données source est dans votre projet par défaut. L'ensemble de données de destination se trouve dans myotherproject. Le raccourci -a permet d'ajouter des données à la table de destination.

bq cp -a \
mydataset.mytable,mydataset.mytable2 \
myotherproject:myotherdataset.mytable

API

Pour copier plusieurs tables à l'aide de l'API, appelez la méthode jobs.insert, configurez une tâche de copie (copy) de table et spécifiez la propriété sourceTables.

Spécifiez la région dans la propriété location de la section jobReference de la ressource de tâche.

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Go.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// copyMultiTable demonstrates using a copy job to copy multiple source tables into a single destination table.
func copyMultiTable(projectID, srcDatasetID string, srcTableIDs []string, dstDatasetID, dstTableID string) error {
	// projectID := "my-project-id"
	// srcDatasetID := "sourcedataset"
	// srcTableIDs := []string{"table1","table2"}
	// dstDatasetID = "destinationdataset"
	// dstTableID = "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	srcDataset := client.Dataset(srcDatasetID)
	dstDataset := client.Dataset(dstDatasetID)
	var tableRefs []*bigquery.Table
	for _, v := range srcTableIDs {
		tableRefs = append(tableRefs, srcDataset.Table(v))
	}
	copier := dstDataset.Table(dstTableID).CopierFrom(tableRefs...)
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Java.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;
import java.util.Arrays;

public class CopyMultipleTables {

  public static void runCopyMultipleTables() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDatasetName = "MY_DATASET_NAME";
    String destinationTableId = "MY_TABLE_NAME";
    copyMultipleTables(destinationDatasetName, destinationTableId);
  }

  public static void copyMultipleTables(String destinationDatasetName, String destinationTableId) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);

      // For more information on CopyJobConfiguration see:
      // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(
                  destinationTable,
                  Arrays.asList(
                      TableId.of(destinationDatasetName, "table1"),
                      TableId.of(destinationDatasetName, "table2")))
              .build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      Job job = bigquery.create(JobInfo.of(configuration));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to copy tables due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table copied successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table copying job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Node.js.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function copyTableMultipleSource() {
  // Copy multiple source tables to a given destination.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // sourceTable = 'my_table';
  // destinationTable = 'testing';

  // Create a client
  const dataset = bigquery.dataset(datasetId);

  const metadata = {
    createDisposition: 'CREATE_NEVER',
    writeDisposition: 'WRITE_TRUNCATE',
  };

  // Create table references
  const table = dataset.table(sourceTable);
  const yourTable = dataset.table(destinationTable);

  // Copy table
  const [apiResponse] = await table.copy(yourTable, metadata);
  console.log(apiResponse.configuration.copy);
}

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Python.


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dest_table_id to the ID of the destination table.
# dest_table_id = "your-project.your_dataset.your_table_name"

# TODO(developer): Set table_ids to the list of the IDs of the original tables.
# table_ids = ["your-project.your_dataset.your_table_name", ...]

job = client.copy_table(table_ids, dest_table_id)  # Make an API request.
job.result()  # Wait for the job to complete.

print("The tables {} have been appended to {}".format(table_ids, dest_table_id))

Supprimer des tables

Vous pouvez supprimer une table à l'aide des méthodes suivantes :

  • En utilisant Cloud Console ou l'UI Web classique de BigQuery
  • En utilisant l'outil de ligne de commande bq rm
  • En appelant la méthode API tables.delete
  • En utilisant les bibliothèques clientes.

Actuellement, vous ne pouvez supprimer qu'une table à la fois.

Lorsque vous supprimez une table, toutes les données de la table sont également supprimées. Pour supprimer automatiquement des tables après une période donnée, définissez le délai d'expiration par défaut de la table pour l'ensemble de données ou spécifiez le délai d'expiration lorsque vous créez la table.

Autorisations requises

Pour supprimer une table, vous devez au minimum disposer des autorisations bigquery.tables.delete et bigquery.tables.get. Les rôles Cloud IAM prédéfinis suivants incluent les autorisations bigquery.tables.delete et bigquery.tables.get :

  • bigquery.dataOwner
  • bigquery.dataEditor
  • bigquery.admin

En outre, si un utilisateur possède les autorisations bigquery.datasets.create, il obtient également un accès bigquery.dataOwner à l'ensemble de données qu'il crée. L'accès bigquery.dataOwner permet à l'utilisateur de supprimer des tables de l'ensemble de données.

Pour en savoir plus sur les rôles et les autorisations Cloud IAM dans BigQuery, consultez la page Rôles et autorisations prédéfinis.

Supprimer une table

Pour supprimer une table, procédez comme suit :

Console

  1. Sélectionnez votre table dans le panneau Ressources. Sous l'éditeur de requête, cliquez sur Delete table (Supprimer la table).

  2. Saisissez le nom de la table dans la boîte de dialogue, puis cliquez sur Supprimer pour confirmer.

UI classique

  1. Cliquez sur l'icône représentant une flèche vers le bas Flèche vers le bas. située à côté du nom de votre table dans la barre de navigation, puis sur Delete table (Supprimer la table).

  2. Lorsque vous y êtes invité, cliquez sur OK pour confirmer l'action.

bq

Exécutez la commande bq rm avec l'option --table (ou le raccourci -t) pour supprimer une table. Lorsque vous supprimez une table à l'aide de l'interface de ligne de commande, vous devez confirmer l'opération. Vous pouvez utiliser l'option --force (ou le raccourci -f) pour ignorer la confirmation.

Si la table se trouve dans un ensemble de données d'un projet autre que votre projet par défaut, ajoutez l'ID du projet au nom de l'ensemble de données en respectant le format suivant : project_id:dataset.

bq rm \
-f \
-t \
project_id:dataset.table

Remplacez l'élément suivant :

  • project_id : ID de votre projet.
  • dataset : nom de l'ensemble de données contenant la table.
  • table : nom de la table que vous supprimez.

Exemples :

Saisissez la commande suivante pour supprimer mytable de mydataset. mydataset se trouve dans votre projet par défaut.

bq rm -t mydataset.mytable

Saisissez la commande suivante pour supprimer mytable de mydataset. mydataset se trouve dans myotherproject, et non dans votre projet par défaut.

bq rm -t myotherproject:mydataset.mytable

Saisissez la commande suivante pour supprimer mytable de mydataset. mydataset se trouve dans votre projet par défaut. La commande utilise le raccourci -f pour contourner la confirmation.

bq rm -f -t mydataset.mytable

API

Appelez la méthode API tables.delete et spécifiez la table à supprimer à l'aide du paramètre tableId.

C#

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour C# décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery C#.


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteTable
{
    public void DeleteTable(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id",
        string tableId = "your_table_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        client.DeleteTable(datasetId, tableId);
        Console.WriteLine($"Table {tableId} deleted.");
    }
}

Go

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Go décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API BigQuery Go.

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// deleteTable demonstrates deletion of a BigQuery table.
func deleteTable(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	table := client.Dataset(datasetID).Table(tableID)
	if err := table.Delete(ctx); err != nil {
		return err
	}
	return nil
}

Java

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence sur l'API BigQuery en langage Java.

TableId tableId = TableId.of(projectId, datasetName, tableName);
boolean deleted = bigquery.delete(tableId);
if (deleted) {
  // the table was deleted
} else {
  // the table was not found
}

Node.js

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Node.js.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function deleteTable() {
  // Deletes "my_table" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);
}

PHP

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour PHP dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery PHP.

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);
$table->delete();
printf('Deleted table %s.%s' . PHP_EOL, $datasetId, $tableId);

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Python.


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to fetch.
# table_id = 'your-project.your_dataset.your_table'

# If the table does not exist, delete_table raises
# google.api_core.exceptions.NotFound unless not_found_ok is True.
client.delete_table(table_id, not_found_ok=True)  # Make an API request.
print("Deleted table '{}'.".format(table_id))

Ruby

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Ruby décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery Ruby.

require "google/cloud/bigquery"

def delete_table dataset_id = "my_dataset_id", table_id = "my_table_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table    = dataset.table table_id

  table.delete

  puts "Table #{table_id} deleted."
end

Restaurer les tables supprimées

Vous pouvez annuler la suppression d'une table dans les sept jours suivant sa suppression (y compris les suppressions explicites et implicites dues à l'expiration de la table). En utilisant la fonctionnalité FOR SYSTEM_TIME AS OF, vous pouvez référencer une table avant l'événement de suppression et la copier.

Une fois les sept jours écoulés, aucune méthode ne permet d'annuler la suppression d'une table. Ni FOR SYSTEM_TIME AS OF, ni un autre moyen (tel qu'une demande d'assistance) ne fonctionneront.

Restaurer une table supprimée

Vous pouvez restaurer une table supprimée à l'aide des méthodes suivantes :

  • En utilisant le décorateur d'instantané @<time> dans l'interface de ligne de commande
  • En utilisant les bibliothèques clientes

Console

Vous ne pouvez pas annuler la suppression d'une table à l'aide de Cloud Console.

UI classique

Vous ne pouvez pas annuler la suppression d'une table à l'aide de l'UI Web classique.

bq

Pour annuler la suppression d'une table, utilisez une opération de copie de table avec le décorateur d'instantané @<time>. Tout d'abord, déterminez un horodatage UNIX (en millisecondes) lorsque la table existait. Ensuite, copiez la table à cet horodatage dans une nouvelle table. La nouvelle table doit avoir un nom différent de celui de la table supprimée.

(Facultatif) Spécifiez l'option --location et définissez la valeur correspondant à votre emplacement.

Par exemple, saisissez la commande suivante pour copier mydataset.mytable au moment 1418864998000 dans une nouvelle table mydataset.newtable.

bq cp mydataset.mytable@1418864998000 mydataset.newtable

Pour en savoir plus, consultez la page Décorateurs de table en ancien SQL.

Go

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// deleteAndUndeleteTable demonstrates how to recover a deleted table by copying it from a point in time
// that predates the deletion event.
func deleteAndUndeleteTable(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	if _, err := ds.Table(tableID).Metadata(ctx); err != nil {
		return err
	}
	// Record the current time.  We'll use this as the snapshot time
	// for recovering the table.
	snapTime := time.Now()

	// "Accidentally" delete the table.
	if err := client.Dataset(datasetID).Table(tableID).Delete(ctx); err != nil {
		return err
	}

	// Construct the restore-from tableID using a snapshot decorator.
	snapshotTableID := fmt.Sprintf("%s@%d", tableID, snapTime.UnixNano()/1e6)
	// Choose a new table ID for the recovered table data.
	recoverTableID := fmt.Sprintf("%s_recovered", tableID)

	// Construct and run a copy job.
	copier := ds.Table(recoverTableID).CopierFrom(ds.Table(snapshotTableID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}

	ds.Table(recoverTableID).Delete(ctx)
	return nil
}

Java

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Java décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Java.

// String datasetId = "my_dataset";
String tableId = "oops_undelete_me";

// Record the current time.  We'll use this as the snapshot time
// for recovering the table.
long snapTime = Instant.now().getMillis();

// "Accidentally" delete the table.
bigquery.delete(TableId.of(datasetId, tableId));

// Construct the restore-from tableID using a snapshot decorator.
String snapshotTableId = String.format("%s@%d", tableId, snapTime);
// Choose a new table ID for the recovered table data.
String recoverTableId = String.format("%s_recovered", tableId);

// Construct and run a copy job.
CopyJobConfiguration configuration =
    CopyJobConfiguration.newBuilder(
        TableId.of(datasetId, recoverTableId),
        TableId.of(datasetId, snapshotTableId))
    .build();
Job job = bigquery.create(JobInfo.of(configuration));
job = job.waitFor();

// Check the table
StandardTableDefinition table = bigquery.getTable(
        TableId.of(datasetId, recoverTableId)).getDefinition();
System.out.println("State: " + job.getStatus().getState());
System.out.printf("Recovered %d rows.\n", table.getNumRows());

Node.js

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Node.js décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Node.js.

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function undeleteTable() {
  // Undeletes "my_table_to_undelete" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table_to_undelete";
  // const recoveredTableId = "my_recovered_table";

  /**
   * TODO(developer): Choose an appropriate snapshot point as epoch milliseconds.
   * For this example, we choose the current time as we're about to delete the
   * table immediately afterwards.
   */
  const snapshotEpoch = Date.now();

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);

  // Construct the restore-from table ID using a snapshot decorator.
  const snapshotTableId = `${tableId}@${snapshotEpoch}`;

  // Construct and run a copy job.
  await bigquery
    .dataset(datasetId)
    .table(snapshotTableId)
    .copy(bigquery.dataset(datasetId).table(recoveredTableId));

  console.log(
    `Copied data from deleted table ${tableId} to ${recoveredTableId}`
  );
}

Python

Avant d'essayer l'exemple ci-dessous, suivez la procédure de configuration pour Python décrite dans le guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery en langage Python.

import time

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Choose a table to recover.
# table_id = "your-project.your_dataset.your_table"

# TODO(developer): Choose a new table ID for the recovered table data.
# recovery_table_id = "your-project.your_dataset.your_table_recovered"

# TODO(developer): Choose an appropriate snapshot point as epoch
# milliseconds. For this example, we choose the current time as we're about
# to delete the table immediately afterwards.
snapshot_epoch = int(time.time() * 1000)

# ...

# "Accidentally" delete the table.
client.delete_table(table_id)  # Make an API request.

# Construct the restore-from table ID using a snapshot decorator.
snapshot_table_id = "{}@{}".format(table_id, snapshot_epoch)

# Construct and run a copy job.
job = client.copy_table(
    snapshot_table_id,
    recovered_table_id,
    # Must match the source and destination tables location.
    location="US",
)  # Make an API request.

job.result()  # Wait for the job to complete.

print(
    "Copied data from deleted table {} to {}".format(table_id, recovered_table_id)
)

Étapes suivantes