Operazioni di eliminazione

Questo documento descrive come eliminare i dati archiviati nelle tabelle Bigtable, spiega quando dovresti utilizzare ogni approccio e fornisce esempi. Prima di leggere questa pagina, dovresti acquisire familiarità con la panoramica di Bigtable e comprendere i concetti della progettazione degli schemi.

Per coerenza, le descrizioni in questa pagina fanno riferimento ai metodi API utilizzati per ogni tipo di richiesta. Tuttavia, ti consigliamo vivamente di utilizzare sempre una delle librerie client di Bigtable per accedere alle API Bigtable anziché utilizzare REST o RPC.

Gli esempi in questa pagina utilizzano dati di esempio simili a quelli che potresti archiviare in Bigtable.

Per conoscere il numero di volte in cui puoi utilizzare le operazioni descritte in questa pagina al giorno, consulta Quote e limiti.

In che modo Bigtable elimina i dati

Quando invii una richiesta di eliminazione, le celle vengono contrassegnate per l'eliminazione e non possono essere lette. I dati vengono rimossi fino a una settimana dopo durante la compazione, un processo in background che ottimizza continuamente la tabella. I metadati di eliminazione possono far sì che i dati occupino leggermente più spazio (diversi kb per riga) per alcuni giorni dopo l'invio di una richiesta di eliminazione, fino alla compattazione successiva.

Puoi sempre inviare una richiesta di eliminazione, anche se il cluster ha superato il limite di spazio di archiviazione e le operazioni di lettura e scrittura sono bloccate.

Elimina un intervallo di righe

Se vuoi eliminare una grande quantità di dati archiviati in righe contigue, utilizza dropRowRange. Questa operazione elimina tutte le righe per un intervallo di righe identificate da una riga iniziale e finale o da un prefisso di chiave di riga.

Le coppie chiave-valore di riga che fornisci quando elimini un intervallo di righe vengono trattate come dati di servizio. Per informazioni su come vengono gestiti i dati di servizio, consulta l'Informativa sulla privacy di Google Cloud.

Una volta completata l'eliminazione e ricevuto una risposta, puoi scrivere in sicurezza i dati nello stesso intervallo di righe.

L'operazione dropRowRange prevede le seguenti limitazioni:

  • Non puoi rilasciare un intervallo di righe da una visualizzazione autorizzata.
  • Non puoi chiamare il metodo dropRowRange in modo asincrono. Se invii una richiesta dropRowRange a una tabella mentre è in corso un'altra richiesta, Bigtable restituisce un errore UNAVAILABLE con il messaggio A DropRowRange operation is already ongoing. Per risolvere l'errore, invia nuovamente la richiesta.
  • Con le istanze che utilizzano la replica, tieni presente che Bigtable potrebbe impiegare molto tempo per completare l'operazione a causa dell'aumento della latenza di replica e dell'utilizzo della CPU. Per eliminare i dati da un'istanza che utilizza la replica, utilizza l'API di dati per leggere e, quindi, eliminare i dati.

I seguenti esempi di codice mostrano come eliminare un intervallo di righe che inizia con il prefisso della chiave di riga phone#5c10102:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Elimina i dati utilizzando i metodi dell'API di dati

Se devi eliminare piccole quantità di dati non contigui, l'eliminazione di dati utilizzando un metodo che chiama l'API Cloud Bigtable (API di dati) è spesso la scelta migliore. Utilizza questi metodi se stai eliminando MB, non GB, di dati in una richiesta. L'utilizzo dell'API di dati è l'unico modo per eliminare i dati da una colonna (non dalla famiglia di colonne).

I metodi dell'API di dati chiamano MutateRows con uno dei tre tipi di mutazione:

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Una richiesta di eliminazione che utilizza l'API di dati è atomica: se la richiesta ha esito positivo e tutti i dati vengono eliminati, oppure la richiesta non va a buon fine e nessun dato viene rimosso.

Nella maggior parte dei casi, evita di utilizzare i metodi CheckAndMutate per eliminare i dati. Nei rari casi in cui fosse necessaria un'elevata coerenza, potresti voler utilizzare questo approccio, ma tieni presente che richiede un elevato utilizzo di risorse e le prestazioni potrebbero risentirne.

Per utilizzare MutateRows al fine di eliminare i dati, invia una richiesta readRows con un filtro per determinare cosa vuoi eliminare, poi invii la richiesta di eliminazione. Per un elenco dei filtri disponibili, consulta Filtri.

Gli esempi in questa sezione presuppongono che tu abbia già determinato quali dati eliminare.

Elimina da una colonna

I seguenti esempi di codice mostrano come eliminare tutte le celle da una colonna in una riga:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Elimina da una famiglia di colonne

I seguenti esempi di codice mostrano come eliminare celle da una famiglia di colonne in una riga:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Elimina da una riga

I seguenti snippet di codice mostrano come eliminare tutte le celle da una riga:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Elimina tramite flusso di dati e batch

I flussi di dati e il raggruppamento in batch delle richieste di eliminazione sono spesso il modo migliore per eliminare grandi quantità di dati. Questa strategia può essere utile quando hai requisiti di conservazione dei dati più granulari rispetto a quanto consentito dai criteri di garbage collection.

I seguenti snippet di codice avviano un flusso di dati (righe di lettura), li raggruppano, quindi passano in rassegna il batch ed eliminano tutte le celle nella colonna data_plan_01gb1 nella famiglia di colonne cell_plan:

Java

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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

Per scoprire come installare e utilizzare la libreria client per Bigtable, consulta Librerie client di Bigtable.

Per eseguire l'autenticazione in Bigtable, configura Credenziali predefinite dell'applicazione. Per maggiori informazioni, consulta Configurare l'autenticazione per le librerie client.

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();

Eliminare i dati in una vista autorizzata

Puoi eliminare i dati della tabella inviando una richiesta di eliminazione a una vista autorizzata. Devi utilizzare uno dei seguenti:

  • Interfaccia a riga di comando gcloud
  • Client Bigtable per Java

Quando elimini i dati da una vista autorizzata, oltre all'ID tabella devi fornire l'ID vista autorizzata.

I dati che puoi eliminare da una visualizzazione autorizzata sono limitati dalla definizione della visualizzazione autorizzata. Puoi eliminare solo i dati inclusi nella vista autorizzata. Se tenti di eliminare dati che non rientrano nella definizione della vista autorizzata o che sono soggetti alle seguenti regole, viene restituito un errore PERMISSION_DENIED:

  • L'eliminazione di un intervallo di righe da una visualizzazione autorizzata utilizzando DropRowRange nell'API Admin non è supportata.
  • L'eliminazione da una riga non è supportata.
  • L'eliminazione da una colonna è supportata purché si tratti delle righe che si trovano nella visualizzazione autorizzata.
  • L'eliminazione da una famiglia di colonne è consentita solo se la famiglia di colonne specificata è configurata in modo da consentire tutti i prefissi qualificatore di colonna (qualifier_prefixes="") nella visualizzazione autorizzata.

Ad esempio, se tenti di eliminare da una riga specificata e questa contiene colonne della tabella sottostante che non sono nella visualizzazione autorizzata, la richiesta non va a buon fine.

Passaggi successivi