Löschvorgänge

In diesem Dokument wird anhand von Beispielen beschrieben, wie Sie in Bigtable-Tabellen gespeicherte Daten löschen. Außerdem wird erläutert, wann Sie welchen Ansatz verwenden sollten. Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Bigtable-Übersicht und mit den Konzepten des Schemadesign vertraut gemacht haben.

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

Die Beispiele auf dieser Seite verwenden Beispieldaten, die den Daten ähneln, die Sie in Bigtable speichern können.

Unter Kontingente und Limits erfahren Sie, wie oft Sie die auf dieser Seite beschriebenen Vorgänge pro Tag nutzen können.

So löscht Bigtable Daten

Wenn Sie eine Löschanfrage senden, werden Zellen zum Löschen markiert und können nicht gelesen werden. Die Daten werden bis zu eine Woche später während der Verdichtung entfernt, einem Hintergrundprozess, durch den die Tabelle kontinuierlich optimiert wird. 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 immer eine Löschanfrage senden, auch wenn Ihr Cluster das Speicherlimit überschritten hat und Lese- und Schreibvorgänge blockiert werden.

Zeilenbereich löschen

Wenn Sie eine große Menge an in zusammenhängenden Zeilen gespeicherten Daten löschen möchten, verwenden Sie dropRowRange. Durch diesen 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 verwendet werden, finden Sie in den Datenschutzhinweisen für Google Cloud.

Nachdem ein erfolgreicher Löschvorgang abgeschlossen ist und Sie eine Antwort erhalten, können Sie Daten sicher in denselben Zeilenbereich schreiben.

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

  • Es ist nicht möglich, einen Bereich von Zeilen aus einer autorisierten Ansicht zu löschen.
  • Sie können die Methode dropRowRange nicht asynchron aufrufen. Wenn Sie eine dropRowRange-Anfrage an eine Tabelle senden, während eine andere Anfrage in Bearbeitung ist, gibt Bigtable einen UNAVAILABLE-Fehler mit der Meldung A DropRowRange operation is already ongoing zurück. Senden Sie die Anfrage noch einmal, um den Fehler zu beheben.
  • Beachten Sie bei Instanzen mit Replikation, dass Bigtable aufgrund der erhöhten Replikationslatenz und CPU-Auslastung lange zum Abschluss des Vorgangs benötigt. Wenn Sie Daten aus einer Instanz mit Replikation löschen möchten, verwenden Sie die Data API, um Ihre Daten zu lesen und dann zu löschen.

Die folgenden Codebeispiele zeigen, wie Sie einen Bereich von Zeilen löschen, die mit dem Zeilenschlüsselpräfix phone#5c10102 beginnen:

Java

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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 Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

Daten mit Data API-Methoden löschen

Wenn Sie kleine Mengen nicht zusammenhängender Daten löschen müssen, ist das Löschen von Daten mit einer Methode, die die Cloud Bigtable API (Data API) aufruft, oft die beste Wahl. Verwenden Sie diese Methoden, wenn Sie MB und nicht GB an Daten in einer Anfrage löschen. Daten aus einer Spalte (nicht aus Spaltenfamilien) können nur über die Data API gelöscht werden.

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

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Eine Löschanfrage, die die Data API verwendet, 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.

In den meisten Fällen sollten Sie keine CheckAndMutate-Methoden zum Löschen von Daten verwenden. In dem seltenen Fall, dass starke 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 MutateRows zum Löschen von Daten verwenden möchten, senden Sie eine readRows-Anfrage mit einem Filter, um zu bestimmen, was gelöscht werden soll. Anschließend senden Sie 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

Die folgenden Codebeispiele zeigen, wie alle Zellen aus einer Spalte einer Zeile gelöscht werden:

Java

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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 Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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

Die folgenden Codebeispiele zeigen, 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 Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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 Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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

Die folgenden Code-Snippets veranschaulichen, wie alle Zellen aus einer Zeile gelöscht werden:

Java

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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 Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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 Batching löschen

Das Streaming und die Batchverarbeitung von Löschanfragen ist oft die beste Möglichkeit, 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 automatische Speicherbereinigung zulassen.

Die folgenden Code-Snippets starten einen Datenstrom (Lesezugriff), einen Batch-Vorgang und löschen dann alle Zellen in Spalte data_plan_01gb1 der Spaltenfamilie cell_plan im Batch:

Java

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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 Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. Weitere Informationen finden Sie unter Authentifizierung für Clientbibliotheken einrichten.

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

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

Richten Sie Standardanmeldedaten für Anwendungen ein, um sich bei Bigtable zu authentifizieren. 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.

Die Daten, die Sie aus einer autorisierten Ansicht löschen können, sind durch die Definition der autorisierten Ansicht eingeschränkt. Sie können nur Daten löschen, die in der autorisierten Ansicht enthalten sind. Wenn Sie versuchen, Daten zu löschen, die außerhalb der Definition der autorisierten Ansicht liegen oder den folgenden Regeln unterliegen, wird der Fehler PERMISSION_DENIED zurückgegeben:

  • Das Löschen eines Bereichs von Zeilen aus einer autorisierten Ansicht mithilfe von 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, solange dies für Zeilen in der autorisierten Ansicht gilt.
  • Das Löschen aus einer Spaltenfamilie ist nur zulässig, wenn die angegebene Spaltenfamilie so konfiguriert ist, dass alle Spaltenqualifizierpräfixe (qualifier_prefixes="") in der autorisierten Ansicht zulässig sind.

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

Nächste Schritte