Eliminazioni

Questo documento descrive come eliminare i dati archiviati nelle tabelle Bigtable, illustra quando utilizzare ciascun approccio e fornisce esempi. Prima di leggere questa pagina, devi avere familiarità con la panoramica di Bigtable e comprendere i concetti coinvolti nella progettazione dello schema.

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 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 scoprire il numero di volte al giorno in cui puoi utilizzare le operazioni descritte in questa pagina, consulta Quote e limiti.

Come 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 compattazione, un processo in background che ottimizza continuamente la tabella. I metadati di eliminazione possono far occupare ai tuoi dati uno spazio leggermente maggiore (diversi kb per riga) per alcuni giorni dopo l'invio di una richiesta di eliminazione, fino alla successiva compattazione.

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

Eliminare 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 della chiave di riga.

I valori chiave di riga che fornisci quando elimini un intervallo di righe vengono trattati come dati del servizio. Per informazioni sulla modalità di gestione dei dati del servizio, consulta l'Google Cloud Informativa sulla privacy.

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

L'operazione dropRowRange presenta le seguenti limitazioni:

  • Non puoi eliminare 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 un'altra richiesta è in corso, Bigtable restituisce un errore UNAVAILABLE con il messaggio A DropRowRange operation is already ongoing. Per risolvere l'errore, invia di nuovo 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 Data per leggere ed eliminare i dati.

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

Java

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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 la sezione Librerie client Bigtable.

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

Eliminare i dati utilizzando i metodi dell'API Data

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

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

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Una richiesta di eliminazione che utilizza l'API Data è atomica: 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. Nel raro caso in cui sia necessaria unaelevata coerenzaa, potresti voler utilizzare questo approccio, ma tieni presente che richiede molte risorse e le prestazioni potrebbero risentirne.

Per utilizzare MutateRows per eliminare i dati, invia una richiesta readRows con un filtro per determinare cosa vuoi eliminare, quindi invia la richiesta di eliminazione. Per un elenco dei filtri disponibili, vedi Filtri.

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

Eliminare da una colonna

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

Java

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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 la sezione Librerie client Bigtable.

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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();

Eliminare da una famiglia di colonne

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

Java

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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 la sezione Librerie client Bigtable.

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

Eliminare da una riga

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

Java

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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 la sezione Librerie client Bigtable.

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

Eliminazione tramite streaming e batch

Lo streaming e il batching 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 di quanto consentito dalle norme di garbage collection.

Se la tua applicazione è scritta in Java, puoi attivare il controllo del flusso di scrittura batch quando invii eliminazioni batch a Bigtable. Per ulteriori informazioni, vedi Controllo del flusso di scrittura batch e Attivare il controllo del flusso di scrittura batch.

Gli esempi di codice riportati di seguito avviano un flusso di dati (lettura delle righe), li raggruppano in batch, quindi scorrono il batch ed eliminano tutte le celle nella colonna data_plan_01gb1 della famiglia di colonne cell_plan:

Vai

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

// Copyright 2025 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

package deletes


import (
	"context"
	"fmt"
	"io"

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

// streamingAndBatching starts a stream of data (reading rows), batches them, and then goes through the batch and deletes all the cells in column
func streamingAndBatching(w io.Writer, projectID, instanceID string, tableName string) error {
	// projectID := "my-project-id"
	// instanceID := "my-instance-id"
	// tableName := "mobile-time-series"

	ctx := context.Background()
	client, err := bigtable.NewClient(ctx, projectID, instanceID)
	if err != nil {
		return fmt.Errorf("bigtable.NewClient: %w", err)
	}
	defer client.Close()
	tbl := client.Open(tableName)

	// Slices to hold the row keys and the corresponding mutations.
	var rowKeys []string
	var mutations []*bigtable.Mutation

	// Read all rows from the table.
	err = tbl.ReadRows(ctx, bigtable.InfiniteRange(""), func(row bigtable.Row) bool {
		// For each row, create a mutation to delete the specified cell.
		mut := bigtable.NewMutation()
		mut.DeleteCellsInColumn("cell_plan", "data_plan_01gb")

		// Append the row key and mutation to the slices.
		rowKeys = append(rowKeys, row.Key())
		mutations = append(mutations, mut)

		// Continue processing rows.
		return true
	})
	if err != nil {
		return fmt.Errorf("tbl.ReadRows: %w", err)
	}

	if len(mutations) == 0 {
		return nil
	}
	// If there are mutations to apply, apply them in a single bulk request.
	// ApplyBulk returns a slice of errors, one for each mutation.
	var errs []error
	if errs, err = tbl.ApplyBulk(ctx, rowKeys, mutations); err != nil {
		return fmt.Errorf("tbl.ApplyBulk: %w", err)
	}
	if errs != nil {
		// Log any individual errors that occurred during the bulk operation.
		var errorCount int
		for _, individualErr := range errs {
			if individualErr != nil {
				fmt.Fprintf(w, "Error applying mutation: %v\n", individualErr)
				errorCount++
			}
		}
		if errorCount > 0 {
			return fmt.Errorf("encountered %d error(s) out of %d mutations", errorCount, len(errs))
		}
	}

	fmt.Fprintf(w, "Successfully deleted cells from all rows")
	return nil
}

Java

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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 la sezione Librerie client Bigtable.

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configurare l'autenticazione per le librerie client.

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

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

Per eseguire l'autenticazione in Bigtable, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi 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 visualizzazione autorizzata

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

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

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

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

  • L'eliminazione di un intervallo di righe da una vista autorizzata utilizzando DropRowRange nell'API Admin non è supportata.
  • L'eliminazione da una riga non è supportata.
  • L'eliminazione da una colonna è supportata purché riguardi le righe presenti nella visualizzazione autorizzata.
  • L'eliminazione da una famiglia di colonne è consentita solo se la famiglia di colonne specificata è configurata per consentire tutti i prefissiqualificatore di colonnaa (qualifier_prefixes="") nella visualizzazione autorizzata.

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

Passaggi successivi