Suppressions

Ce document explique comment supprimer des données stockées dans des tables Bigtable, quand utiliser chaque approche et fournit des exemples. Avant de lire cette page, vous devez vous familiariser avec la présentation de Bigtable et comprendre les concepts impliqués dans la conception de schémas.

Par souci de cohérence, les descriptions de cette page font référence aux méthodes API utilisées pour chaque type de requête. Toutefois, nous vous recommandons vivement de toujours utiliser l'une des bibliothèques clientes Bigtable pour accéder aux API Bigtable au lieu d'utiliser REST ou RPC.

Les exemples de cette page utilisent des exemples de données semblables à ceux que vous pouvez stocker dans Bigtable.

Pour connaître le nombre d'utilisations quotidiennes des opérations décrites sur cette page, consultez la page Quotas et limites.

Comment Bigtable supprime les données

Lorsque vous envoyez une demande de suppression, les cellules sont marquées pour suppression et ne peuvent pas être lues. Les données sont supprimées jusqu'à une semaine plus tard lors du compactage, un processus en arrière-plan qui optimise en permanence la table. Les métadonnées de suppression peuvent entraîner un espace légèrement plus important pour vos données (plusieurs ko par ligne) pendant quelques jours après l'envoi d'une requête de suppression, jusqu'au compactage suivant.

Vous pouvez toujours envoyer une demande de suppression, même si votre cluster a dépassé la limite de stockage et que les lectures et les écritures sont bloquées.

Supprimer une plage de lignes

Si vous souhaitez supprimer une grande quantité de données stockées dans des lignes contiguës, utilisez dropRowRange. Cette opération supprime toutes les lignes d'une plage de lignes identifiée par une ligne de début et de fin ou un préfixe de clé de ligne.

Les valeurs de clé de ligne que vous fournissez lorsque vous supprimez une plage de lignes sont traitées comme des données de service. Pour en savoir plus sur le traitement des données des services, consultez l'Avis de confidentialité de Google Cloud.

Une fois que la suppression a abouti et que vous avez reçu une réponse, vous pouvez écrire des données en toute sécurité dans la même plage de lignes.

L'opération dropRowRange comporte les restrictions suivantes:

  • Vous ne pouvez pas supprimer une plage de lignes d'une vue autorisée.
  • Vous ne pouvez pas appeler la méthode dropRowRange de manière asynchrone. Si vous envoyez une requête dropRowRange à une table alors qu'une autre requête est en cours, Bigtable renvoie une erreur UNAVAILABLE avec le message A DropRowRange operation is already ongoing. Pour résoudre l'erreur, renvoyez la requête.
  • Avec les instances qui utilisent la réplication, sachez que Bigtable peut prendre beaucoup de temps pour terminer l'opération en raison de l'augmentation de la latence de réplication et de l'utilisation du processeur. Pour supprimer des données d'une instance qui utilise la réplication, utilisez l'API Data pour lire, puis supprimer vos données.

Les exemples de code suivants montrent comment supprimer une plage de lignes commençant par le préfixe de clé de ligne phone#5c10102:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.cloud.bigtable.admin.v2.BigtableTableAdminClient;
import java.io.IOException;

public class DropRowRangeExample {
  public void dropRowRange(String projectId, String instanceId, String tableId) throws IOException {
    try (BigtableTableAdminClient tableAdminClient =
        BigtableTableAdminClient.create(projectId, instanceId)) {
      tableAdminClient.dropRowRange(tableId, "phone#4c410523");
    }
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

def drop_row_range(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)
    table = instance.table(table_id)
    row_key_prefix = "phone#4c410523"
    table.drop_by_prefix(row_key_prefix, timeout=200)

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

await table.deleteRows('phone#5c10102');
await printRows();

Supprimer des données à l'aide des méthodes de l'API Data

Si vous devez supprimer de petites quantités de données non contiguës, la suppression de données à l'aide d'une méthode qui appelle l'API Cloud Bigtable (API Data) est souvent le meilleur choix. Utilisez ces méthodes si vous supprimez des Mo, et non des Go, de données dans une requête. L'utilisation de l'API Data est le seul moyen de supprimer les données d'une colonne (et non une famille de colonnes).

Les méthodes de l'API Data appellent MutateRows avec l'un des trois types de mutations suivants:

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Une requête de suppression à l'aide de l'API Data est atomique: soit la requête aboutit et toutes les données sont supprimées, soit la requête échoue et aucune donnée n'est supprimée.

Dans la plupart des cas, évitez d'utiliser les méthodes CheckAndMutate pour supprimer des données. Dans les rares cas où vous avez besoin d'une cohérence forte, vous pouvez utiliser cette approche. Sachez toutefois qu'elle nécessite beaucoup de ressources et que les performances peuvent être affectées.

Pour supprimer des données à l'aide de MutateRows, envoyez une requête readRows avec un filtre permettant de déterminer ce que vous souhaitez supprimer, puis envoyez la demande de suppression. Pour obtenir la liste des filtres disponibles, consultez la section Filtres.

Les exemples de cette section supposent que vous avez déjà déterminé les données à supprimer.

Supprimer d'une colonne

Les exemples de code suivants montrent comment supprimer toutes les cellules d'une colonne dans une ligne:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.models.Mutation;
import com.google.cloud.bigtable.data.v2.models.RowMutation;
import com.google.cloud.bigtable.data.v2.models.TableId;
import java.io.IOException;

public class DeleteFromColumnExample {
  public void deleteFromColumnCells(String projectId, String instanceId, String tableId)
      throws IOException {
    try (BigtableDataClient dataClient = BigtableDataClient.create(projectId, instanceId)) {
      Mutation mutation = Mutation.create().deleteCells("cell_plan", "data_plan_01gb");
      dataClient.mutateRow(
          RowMutation.create(TableId.of(tableId), "phone#4c410523#20190501", mutation));
    }
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

def delete_from_column(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)
    table = instance.table(table_id)
    row = table.row("phone#4c410523#20190501")
    row.delete_cell(column_family_id="cell_plan", column="data_plan_01gb")
    row.commit()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

await table.mutate({
  key: 'phone#4c410523#20190501',
  method: 'delete',
  data: {
    column: 'cell_plan:data_plan_05gb',
  },
});
await printRows();

Supprimer d'une famille de colonnes

Les exemples de code suivants montrent comment supprimer des cellules d'une famille de colonnes dans une ligne:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.models.RowMutation;
import com.google.cloud.bigtable.data.v2.models.TableId;
import java.io.IOException;

public class DeleteFromColumnFamilyExample {
  public void deleteFromColumnFamily(String projectId, String instanceId, String tableId)
      throws IOException {
    try (BigtableDataClient dataClient = BigtableDataClient.create(projectId, instanceId)) {
      dataClient.mutateRow(
          RowMutation.create(TableId.of(tableId), "phone#5c10102#20190501")
              .deleteFamily("stats_summary"));
    }
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

def delete_from_column_family(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)
    table = instance.table(table_id)
    row = table.row("phone#4c410523#20190501")
    row.delete_cells(column_family_id="cell_plan", columns=row.ALL_COLUMNS)
    row.commit()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

await table.mutate({
  key: 'phone#4c410523#20190501',
  method: 'delete',
  data: {
    column: 'cell_plan',
  },
});
await printRows();

Supprimer d'une ligne

Les extraits de code suivants montrent comment supprimer toutes les cellules d'une ligne:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.models.Mutation;
import com.google.cloud.bigtable.data.v2.models.RowMutation;
import com.google.cloud.bigtable.data.v2.models.TableId;
import java.io.IOException;

public class DeleteFromRowExample {
  public void deleteFromRow(String projectId, String instanceId, String tableId)
      throws IOException {
    try (BigtableDataClient dataClient = BigtableDataClient.create(projectId, instanceId)) {
      Mutation mutation = Mutation.create().deleteRow();
      dataClient.mutateRow(
          RowMutation.create(TableId.of(tableId), "phone#4c410523#20190501", mutation));
    }
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

def delete_from_row(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)
    table = instance.table(table_id)
    row = table.row("phone#4c410523#20190501")
    row.delete()
    row.commit()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

const row = table.row('phone#4c410523#20190501');
await row.delete();
await printRows();

Supprimer par flux et par lot

Le streaming et le traitement par lot de vos requêtes de suppression sont souvent le meilleur moyen de supprimer de grandes quantités de données. Cette stratégie peut s'avérer utile lorsque vous avez des exigences de conservation des données plus précises que ne le permettent les règles de récupération de mémoire.

Les extraits de code suivants démarrent un flux de données (lecture des lignes), les regroupent, puis passent en revue le lot et suppriment toutes les cellules de la colonne data_plan_01gb1 dans la famille de colonnes cell_plan:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

import com.google.api.gax.batching.Batcher;
import com.google.api.gax.rpc.ServerStream;
import com.google.cloud.bigtable.data.v2.BigtableDataClient;
import com.google.cloud.bigtable.data.v2.models.Query;
import com.google.cloud.bigtable.data.v2.models.Row;
import com.google.cloud.bigtable.data.v2.models.RowMutationEntry;
import com.google.cloud.bigtable.data.v2.models.TableId;
import java.io.IOException;

public class BatchDeleteExample {
  public void batchDelete(String projectId, String instanceId, String tableId)
      throws InterruptedException, IOException {
    try (BigtableDataClient dataClient = BigtableDataClient.create(projectId, instanceId)) {
      try (Batcher<RowMutationEntry, Void> batcher =
          dataClient.newBulkMutationBatcher(TableId.of(tableId))) {
        ServerStream<Row> rows = dataClient.readRows(Query.create(TableId.of(tableId)));
        for (Row row : rows) {
          batcher.add(
              RowMutationEntry.create(row.getKey()).deleteCells("cell_plan", "data_plan_05gb"));
        }
        // Blocks until mutations are applied on all submitted row entries.
        batcher.flush();
      }
    }
  }
}

Python

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

def streaming_and_batching(project_id, instance_id, table_id):
    client = bigtable.Client(project=project_id, admin=True)
    instance = client.instance(instance_id)
    table = instance.table(table_id)
    batcher = table.mutations_batcher(flush_count=2)
    rows = table.read_rows()
    for row in rows:
        row = table.row(row.row_key)
        row.delete_cell(column_family_id="cell_plan", column="data_plan_01gb")

    batcher.mutate_rows(rows)

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la page Bibliothèques clientes Bigtable.

Pour vous authentifier auprès de Bigtable, configurez les Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

const rows = (await table.getRows({limit: 2}))[0];
const entries = rows.map(row => {
  return {
    key: row.id,
    method: 'delete',
    data: {
      column: 'cell_plan:data_plan_05gb',
    },
  };
});
await table.mutate(entries);
await printRows();

Supprimer des données dans une vue autorisée

Vous pouvez supprimer les données d'une table en envoyant une demande de suppression à une vue autorisée. Vous devez utiliser l'une des versions suivantes :

  • gcloud CLI
  • Client Bigtable pour Java

Lorsque vous supprimez des données d'une vue autorisée, vous fournissez l'ID de la vue autorisée en plus de l'ID de la table.

Les données que vous pouvez supprimer d'une vue autorisée sont limitées par la définition de la vue autorisée. Vous ne pouvez supprimer que les données incluses dans la vue autorisée. Si vous tentez de supprimer des données en dehors de la définition de la vue autorisée ou qui sont soumises aux règles suivantes, une erreur PERMISSION_DENIED s'affiche:

  • Il n'est pas possible de supprimer une plage de lignes d'une vue autorisée à l'aide de DropRowRange dans l'API Admin.
  • Il n'est pas possible de les supprimer d'une ligne.
  • La suppression d'une colonne est possible tant que cela concerne les lignes figurant dans la vue autorisée.
  • La suppression d'une famille de colonnes n'est autorisée que si la famille de colonnes spécifiée est configurée pour autoriser tous les préfixes de qualificatifs de colonne (qualifier_prefixes="") dans la vue autorisée.

Par exemple, si vous tentez d'effectuer une suppression à partir d'une ligne spécifiée et que celle-ci contient des colonnes de la table sous-jacente qui ne figurent pas dans votre vue autorisée, la requête échoue.

Étapes suivantes