Suppressions

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

Par souci de cohérence, les descriptions sur cette page font référence aux méthodes d'API utilisée pour chaque type de requête. Toutefois, nous vous conseillons vivement de toujours utilisez l'un des clients Bigtable bibliothèques pour accéder aux API Bigtable plutôt que d'utiliser REST ou RPC.

Les exemples de cette page utilisent échantillons de données à celles que vous pouvez stocker dans Bigtable.

Pour connaître le nombre de fois que vous pouvez utiliser les opérations décrites sur cette page par jour, consultez la section Quotas et limites.

Comment Bigtable supprime-t-il les données ?

Lorsque vous envoyez une requête 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 de la compaction, un processus en arrière-plan qui optimise en continu la table. La suppression des métadonnées peut entraîner des problèmes un peu plus d'espace (plusieurs ko par ligne) pendant quelques jours après l'envoi d'un de suppression, jusqu'au compactage suivant.

Vous pouvez toujours envoyer une requête 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 de service, consultez l'Avis de confidentialité de Google Cloud.

Une fois la suppression terminée 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 est soumise aux 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 un dropRowRange vers 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, envoyez le demande à nouveau.
  • Avec les instances qui utilisent la réplication, sachez que Bigtable peut prendre beaucoup de temps pour effectuer 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 section 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 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 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 des données d'une colonne (et non d'une colonne) famille).

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 elle é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 le cas rare où vous avez besoin d'une cohérence forte, vous pouvez envisager d'utiliser cette approche. Toutefois, sachez qu'elle est gourmande en ressources et que les performances peuvent être affectées.

Pour utiliser MutateRows pour supprimer des données, vous envoyez une requête readRows avec un filtre pour déterminer ce que vous souhaitez supprimer, puis vous envoyez la requête de suppression. Pour obtenir la liste des filtres disponibles, consultez Filtres :

Les exemples de cette section partent du principe que vous avez déjà déterminé quelles données supprimer.

Supprimer d'une colonne

Les exemples de code suivants montrent comment supprimer toutes les cellules d'une colonne à la suite:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la section 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 section 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()

Python asyncio

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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.

async def delete_from_column(project_id, instance_id, table_id):
    client = BigtableDataClientAsync(project=project_id)
    table = client.get_table(instance_id, table_id)

    await table.mutate_row(
        "phone#4c410523#20190501",
        DeleteRangeFromColumn(family="cell_plan", qualifier=b"data_plan_01gb"),
    )

    await table.close()
    await client.close()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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 à la suite:

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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 section 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()

Python asyncio

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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.

async def delete_from_column_family(project_id, instance_id, table_id):
    client = BigtableDataClientAsync(project=project_id)
    table = client.get_table(instance_id, table_id)

    await table.mutate_row("phone#4c410523#20190501", DeleteAllFromFamily("cell_plan"))

    await table.close()
    await client.close()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la section 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 à partir 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 section 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 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()

Python asyncio

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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.

async def delete_from_row(project_id, instance_id, table_id):
    client = BigtableDataClientAsync(project=project_id)
    table = client.get_table(instance_id, table_id)

    await table.mutate_row("phone#4c410523#20190501", DeleteAllFromRow())

    await table.close()
    await client.close()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la section 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

La diffusion et le traitement par lot des requêtes de suppression constituent souvent le meilleur moyen de supprimer de grandes quantités de données. Cette stratégie peut s'avérer utile lorsque vous disposez les exigences de conservation des données par rapport aux stratégies de récupération de mémoire.

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

Java

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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 section 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)

Python asyncio

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez la section 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.

async def streaming_and_batching(project_id, instance_id, table_id):
    client = BigtableDataClientAsync(project=project_id)
    table = client.get_table(instance_id, table_id)

    async with table.mutations_batcher() as batcher:
        async for row in await table.read_rows_stream(ReadRowsQuery(limit=10)):
            await batcher.append(
                RowMutationEntry(
                    row.row_key,
                    DeleteRangeFromColumn(
                        family="cell_plan", qualifier=b"data_plan_01gb"
                    ),
                )
            )

    await table.close()
    await client.close()

Node.js

Pour savoir comment installer et utiliser la bibliothèque cliente pour Bigtable, consultez 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 à un vue autorisée. Vous devez utiliser l'une des versions suivantes :

  • CLI gcloud
  • 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 d'une vue autorisée. Vous ne pouvez supprimer que les données incluses dans la vue autorisée. Si vous essayez de supprimer des données qui ne sont pas incluses dans la définition de la vue autorisée ou qui sont soumises aux règles suivantes, une erreur PERMISSION_DENIED est renvoyée :

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

Par exemple, si vous essayez de supprimer une ligne spécifiée et que cette ligne contient des colonnes dans la table sous-jacente qui ne figurent pas dans votre vue autorisée, la requête échoue.

Étape suivante