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 avoir lu la présentation de Bigtable et comprendre les concepts impliqués dans la conception de schémas.

Pour des raisons de cohérence, les descriptions de cette page font référence aux méthodes d'API utilisées pour chaque type de requête. Toutefois, nous vous recommandons vivement d'utiliser toujours 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 à celles que vous pourriez 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. Les métadonnées de suppression peuvent entraîner une augmentation de l'espace occupé par vos données (plusieurs ko par ligne) pendant quelques jours après l'envoi d'une demande de suppression, jusqu'au prochain compactage.

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 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 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 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 drop_row_range(project_id, instance_id, table_id):
    from google.cloud.bigtable import Client

    client = 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 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.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 famille de colonnes).

Les méthodes de l'API Data appellent MutateRows avec l'un des trois types de mutation 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 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 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 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):
    from google.cloud.bigtable import Client

    client = 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 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 delete_from_column(project_id, instance_id, table_id):
    from google.cloud.bigtable.data import BigtableDataClientAsync
    from google.cloud.bigtable.data import DeleteRangeFromColumn

    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 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: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 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.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):
    from google.cloud.bigtable import Client

    client = 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 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 delete_from_column_family(project_id, instance_id, table_id):
    from google.cloud.bigtable.data import BigtableDataClientAsync
    from google.cloud.bigtable.data import DeleteAllFromFamily

    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 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 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_row(project_id, instance_id, table_id):
    from google.cloud.bigtable import Client

    client = 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 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 delete_from_row(project_id, instance_id, table_id):
    from google.cloud.bigtable.data import BigtableDataClientAsync
    from google.cloud.bigtable.data import DeleteAllFromRow

    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 streaming et par lot

Le streaming et le traitement par lot de vos demandes de suppression sont souvent le meilleur moyen de supprimer de grandes quantités de données. Cette stratégie peut être utile lorsque vous avez des exigences de conservation des données plus précises que celles autorisées par les règles de récupération des déchets.

Si votre application est écrite en Java, vous pouvez activer le contrôle du flux d'écriture par lot lorsque vous envoyez des suppressions par lot à Bigtable. Pour en savoir plus, consultez la section Contrôle de flux d'écriture par lot. Pour savoir comment l'activer, consultez Activer le contrôle du flux d'écriture par lot.

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 dans la famille de colonnes cell_plan:

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.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):
    from google.cloud.bigtable import Client

    client = 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):
    from google.cloud.bigtable.data import BigtableDataClientAsync
    from google.cloud.bigtable.data import DeleteRangeFromColumn
    from google.cloud.bigtable.data import RowMutationEntry
    from google.cloud.bigtable.data import ReadRowsQuery

    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 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 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 requête de suppression à une 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 de la 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 éléments d'une ligne.
  • La suppression d'une colonne est autorisée, à condition qu'elle concerne des 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 qualificatif 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