Löschvorgänge

In diesem Dokument wird beschrieben, wie Sie in Bigtable-Tabellen gespeicherte Daten löschen. Außerdem wird erläutert, wann Sie die einzelnen Methoden verwenden sollten, und es werden Beispiele aufgeführt. Bevor Sie diese Seite lesen, sollten Sie sich mit der Bigtable-Übersicht und den Konzepten des Schemadesigns vertraut machen.

Aus Gründen der Einheitlichkeit beziehen sich die Beschreibungen auf dieser Seite auf die API-Methoden, die für jede Anfrage verwendet werden. Wir empfehlen jedoch dringend, immer eine der Bigtable-Clientbibliotheken zum Zugriff auf die Bigtable APIs zu verwenden, anstatt REST oder RPC.

In den Beispielen auf dieser Seite werden Beispieldaten verwendet, die denen ähneln, die Sie in Bigtable speichern könnten.

Informationen dazu, wie oft Sie die auf dieser Seite beschriebenen Vorgänge pro Tag verwenden können, finden Sie unter Kontingente und Limits.

So werden Daten in Bigtable gelöscht

Wenn Sie eine Löschanfrage senden, werden Zellen zum Löschen markiert und können nicht mehr gelesen werden. Die Daten werden bis zu einer Woche später bei der Datenkomprimierung entfernt. Dabei handelt es sich um einen Hintergrundprozess, der die Tabelle kontinuierlich optimiert. Löschmetadaten können dazu führen, dass Ihre Daten nach dem Senden einer Löschanfrage einige Tage lang etwas mehr Speicherplatz (mehrere KB pro Zeile) belegen, bis die nächste Verdichtung erfolgt.

Sie können jederzeit eine Löschanfrage senden, auch wenn Ihr Cluster das Speicherlimit überschritten hat und Lese- und Schreibvorgänge blockiert sind.

Zeilenbereich löschen

Wenn Sie eine große Menge an Daten löschen möchten, die in benachbarten Zeilen gespeichert sind, verwenden Sie dropRowRange. Bei diesem Vorgang werden alle Zeilen für einen Zeilenbereich gelöscht, der durch eine Start- und eine Endzeile oder ein Zeilenschlüsselpräfix gekennzeichnet ist.

Die Zeilenschlüsselwerte, die Sie beim Löschen eines Zeilenbereichs angeben, werden als Dienstdaten behandelt. Informationen dazu, wie Dienstdaten verarbeitet werden, finden Sie in den Datenschutzhinweisen für Google Cloud.

Nachdem die Daten erfolgreich gelöscht wurden und Sie eine Antwort erhalten haben, können Sie wieder Daten in denselben Zeilenbereich schreiben.

Für den Vorgang dropRowRange gelten die folgenden Einschränkungen:

  • Sie können keinen Zeilenbereich aus einer autorisierten Ansicht einfügen.
  • Die dropRowRange-Methode kann nicht asynchron aufgerufen werden. Wenn Sie eine dropRowRange-Anfrage an eine Tabelle senden, während eine andere Anfrage in Bearbeitung ist, gibt Bigtable den Fehler UNAVAILABLE mit der Meldung A DropRowRange operation is already ongoing zurück. Senden Sie die Anfrage noch einmal, um den Fehler zu beheben.
  • Bei Instanzen mit Replikation kann es aufgrund der erhöhten Replikationslatenz und CPU-Auslastung lange dauern, bis Bigtable den Vorgang abgeschlossen hat. Wenn Sie Daten aus einer Instanz löschen möchten, die die Replikation verwendet, lesen und löschen Sie die Daten mit der Data API.

Die folgenden Codebeispiele zeigen, wie Sie einen Zeilenbereich löschen, der mit dem Zeilenschlüsselpräfix phone#5c10102 beginnt:

Java

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Daten mithilfe von Data API-Methoden löschen

Wenn Sie kleine Mengen nicht zusammenhängender Daten löschen möchten, ist es oft am besten, die Daten mit einer Methode zu löschen, die die Cloud Bigtable API (Data API) aufruft. Verwenden Sie diese Methoden, wenn Sie in einer Anfrage MB, nicht GB, an Daten löschen. Die Data API ist die einzige Möglichkeit, Daten aus einer Spalte (nicht aus einer Spaltenfamilie) zu löschen.

Data API-Methoden rufen MutateRows mit einem der drei Mutationstypen auf:

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Eine Löschanfrage mit der Data API ist atomar: Entweder ist die Anfrage erfolgreich und alle Daten werden gelöscht oder die Anfrage schlägt fehl und es werden keine Daten entfernt.

Verwenden Sie in den meisten Fällen keine CheckAndMutate-Methoden zum Löschen von Daten. In seltenen Fällen, in denen eine hohe Konsistenz erforderlich ist, können Sie diesen Ansatz verwenden. Beachten Sie jedoch, dass er ressourcenintensiv ist und die Leistung beeinträchtigt werden kann.

Wenn Sie Daten mit MutateRows löschen möchten, senden Sie eine readRows-Anfrage mit einem Filter, um festzulegen, was gelöscht werden soll, und senden Sie dann die Löschanfrage. Eine Liste der verfügbaren Filter finden Sie unter Filter.

Bei den Beispielen in diesem Abschnitt wird davon ausgegangen, dass Sie bereits festgelegt haben, welche Daten gelöscht werden sollen.

Aus einer Spalte löschen

In den folgenden Codebeispielen wird gezeigt, wie Sie alle Zellen aus einer Spalte in einer Zeile löschen:

Java

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Aus einer Spaltenfamilie löschen

In den folgenden Codebeispielen wird gezeigt, wie Zellen aus einer Spaltenfamilie in einer Zeile gelöscht werden:

Java

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Aus einer Zeile löschen

In den folgenden Code-Snippets wird gezeigt, wie Sie alle Zellen aus einer Zeile löschen:

Java

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Durch Streaming und Batchverarbeitung löschen

Das Streaming und Batching von Löschanfragen ist oft die beste Methode, um große Datenmengen zu löschen. Diese Strategie kann nützlich sein, wenn Sie detailliertere Anforderungen an die Datenaufbewahrung haben, als die Richtlinien für die Garbage Collection zulassen.

Wenn Ihre Anwendung in Java geschrieben ist, können Sie die Steuerung des Batch-Schreibvorgangs aktivieren, wenn Sie Batch-Löschvorgänge an Bigtable senden. Weitere Informationen finden Sie unter Ablaufsteuerung für Batch-Schreibvorgänge. Eine Anleitung dazu, wie Sie die Steuerung aktivieren, finden Sie unter Steuerung des Batch-Schreibvorgangs aktivieren.

Mit den folgenden Code-Snippets wird ein Datenstream gestartet (Zeilen gelesen), in Batches zusammengefasst und dann werden alle Zellen in Spalte data_plan_01gb1 in der Spaltenfamilie cell_plan gelöscht:

Java

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Informationen zum Installieren und Verwenden der Clientbibliothek für Bigtable finden Sie unter Bigtable-Clientbibliotheken.

Richten Sie zur Authentifizierung bei Bigtable die Standardanmeldedaten für Anwendungen ein. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Daten in einer autorisierten Ansicht löschen

Sie können Tabellendaten löschen, indem Sie eine Löschanfrage an eine autorisierte Ansicht senden. Sie müssen eine der folgenden Optionen verwenden:

  • gcloud-CLI
  • Bigtable-Client für Java

Wenn Sie Daten aus einer autorisierten Ansicht löschen, geben Sie zusätzlich zur Tabellen-ID die ID der autorisierten Ansicht an.

Welche Daten Sie aus einer autorisierten Ansicht löschen können, wird durch die Definition der autorisierten Ansicht bestimmt. Sie können nur Daten löschen, die in der autorisierten Ansicht enthalten sind. Wenn Sie versuchen, Daten zu löschen, die nicht zur Definition der autorisierten Datenansicht gehören oder für die die folgenden Regeln gelten, wird der Fehler PERMISSION_DENIED zurückgegeben:

  • Das Löschen eines Zeilenbereichs aus einer autorisierten Ansicht mit DropRowRange in der Admin API wird nicht unterstützt.
  • Das Löschen aus einer Zeile wird nicht unterstützt.
  • Das Löschen aus einer Spalte wird unterstützt, sofern es sich um Zeilen handelt, die sich in der autorisierten Ansicht befinden.
  • Das Löschen aus einer Spaltenfamilie ist nur zulässig, wenn die angegebene Spaltenfamilie so konfiguriert ist, dass alle Präfixe für Spaltenqualifizierer (qualifier_prefixes="") in der autorisierten Ansicht zulässig sind.

Wenn Sie beispielsweise versuchen, Daten aus einer bestimmten Zeile zu löschen, diese Zeile aber Spalten in der zugrunde liegenden Tabelle enthält, die nicht in Ihrer autorisierten Ansicht enthalten sind, schlägt die Anfrage fehl.

Nächste Schritte