Löschvorgänge

In diesem Dokument wird beschrieben, wie Sie in Bigtable-Tabellen gespeicherte Daten löschen. Außerdem wird erläutert, wann Sie den jeweiligen Ansatz verwenden sollten. Außerdem finden Sie hier Beispiele. Bevor Sie diese Seite lesen, sollten Sie sich mit den Informationen unter Bigtable vertraut machen und mit den Konzepten des Schemadesigns vertraut sein.

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, immer eine der Bigtable-Clientbibliotheken für den Zugriff auf die Bigtable APIs zu verwenden, anstatt REST oder RPC zu verwenden.

In den Beispielen auf dieser Seite werden Beispieldaten verwendet, die den Daten ähneln, die Sie in Bigtable speichern.

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

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 bei der Verdichtung entfernt, einem Hintergrundprozess, der die Tabelle kontinuierlich optimiert. Löschmetadaten können dazu führen, dass Ihre Daten nach dem Senden einer Löschanfrage für einige Tage bis zur nächsten Verdichtung etwas mehr Speicherplatz einnehmen (mehrere KB pro Zeile).

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

Einen Zeilenbereich löschen

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

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

Nachdem ein erfolgreiches Löschen abgeschlossen ist und Sie eine Antwort erhalten, können Sie Daten bedenkenlos in denselben Zeilenbereich schreiben.

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

  • Sie können keinen Zeilenbereich aus einer autorisierten Ansicht löschen.
  • Die Methode dropRowRange kann nicht asynchron aufgerufen werden. Wenn Sie eine dropRowRange-Anfrage an eine Tabelle senden, während eine andere Anfrage ausgeführt wird, gibt Bigtable einen Fehler zurück. Senden Sie die Anfrage noch einmal, um den Fehler zu beheben.
  • Beachten Sie bei Instanzen, die Replikation verwenden, dass der Vorgang in Bigtable aufgrund der erhöhten Replikationslatenz und CPU-Nutzung lange dauern kann. Wenn Sie Daten aus einer Instanz mit Replikation löschen möchten, verwenden Sie die Data API, um die Daten zu lesen und anschließend 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 in einer Anfrage MB (nicht GB) an Daten löschen möchten. Daten aus einer Spalte (nicht der Spaltenfamilie) können nur mithilfe der Data API gelöscht werden.

Daten-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 verwenden, um Daten zu löschen. In dem seltenen Fall, dass Sie strikte Konsistenz benötigen, 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 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 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()

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 Sie Zellen aus einer Spaltenfamilie in einer Zeile löschen:

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

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

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

Per Streaming und Batching löschen

Das Streamen von Löschanfragen oder die Batchverarbeitung ist häufig 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 Datenstream (Lesezeilen), stapeln sie, durchlaufen den Batch und löschen alle Zellen in Spalte data_plan_01gb1 in der Spaltenfamilie cell_plan:

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)

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 nicht in der Definition der autorisierten Ansicht enthalten sind oder den folgenden Regeln unterliegen, 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 dies für Zeilen gilt, 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 Spaltenqualifiziererprä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