削除

このドキュメントでは、Bigtable テーブルに保存されているデータを削除する方法、それぞれの方法を使用するタイミングについて説明し、例を示します。このページを読む前に、Bigtable の概要をよく知っており、スキーマ設計に関連するコンセプトを理解している必要があります。

内容に一貫性を持たせるため、このページの説明では、リクエストの種類ごとに使用される API メソッドを示します。ただし、REST や RPC を使用するのではなく、必ず Bigtable クライアント ライブラリのいずれかを使用して Bigtable API にアクセスすることを強くおすすめします。

このページの例では、Bigtable に保存されるデータに似たサンプルデータを使用します。

このページで説明するオペレーションを実行できる 1 日あたりの回数については、割り当てと上限をご覧ください。

Bigtable でのデータの削除

削除リクエストを送信すると、セルには削除マークが付けられ、読み取ることができません。データは、最大でも 1 週間後、コンパクション(テーブルを継続的に最適化するバックグラウンド プロセス)中に削除されます。削除リクエストを送信してから次のコンパクションが発生するまでの数日間は、削除メタデータにより、データの容量が少し多く(1 行あたり数 kb)消費される可能性があります。

クラスタがストレージ上限を超過し、読み取りと書き込みがブロックされている場合でも、削除リクエストはいつでも送信できます。

行の範囲を削除する

連続した行に保存されている大量のデータを削除する場合は、dropRowRange を使用します。このオペレーションでは、開始行と終了行、または行キー接頭辞によって識別される特定の範囲の行がすべて削除されます。

行の範囲を削除する際に指定する行キー値は、サービスデータとして扱われます。サービスデータが取り扱われる方法については、Google Cloud のプライバシーに関するお知らせをご覧ください。

正常に削除され、レスポンスを受け取ったら、同じ行範囲にデータを安全に書き込めます。

dropRowRange オペレーションには次の制限があります。

  • 承認済みビューから特定の範囲の行を削除することはできません。
  • dropRowRange メソッドを非同期で呼び出すことはできません。別のリクエストの進行中に dropRowRange リクエストをテーブルに送信すると、Bigtable はメッセージ A DropRowRange operation is already ongoing を含む UNAVAILABLE エラーを返します。エラーを解決するには、リクエストを再度送信します。
  • レプリケーションを使用するインスタンスでは、レプリケーションのレイテンシと CPU 使用率が増加するため、Bigtable はオペレーションの完了に長い時間を要する場合があります。レプリケーションを使用するインスタンスからデータを削除するには、Data API を使用してデータを読み取ってから削除します。

次のコードサンプルでは、行キー接頭辞 phone#5c10102 で始まる行の範囲を削除する方法を示します:

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Data API メソッドでデータを削除する

連続しない少量のデータを削除する必要がある場合は、Cloud Bigtable API(Data API)を呼び出すメソッドでデータを削除することをおすすめします。リクエストで MB のデータ(GB ではない)を削除する場合は、以下のメソッドを使用します。Data API を使用することが、(列ファミリーではなく)列からデータを削除する唯一の方法です。

Data API メソッドは、次の 3 種類のミューテーションのいずれかを使用して MutateRows を呼び出します。

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Data API を使用した削除リクエストはアトミックです。リクエストが成功するとすべてのデータは削除されますが、リクエストが失敗するとデータは削除されません。

ほとんどの場合で、CheckAndMutate メソッドを使用してデータを削除することは避けてください。強整合性を必要とするまれな場合は、この方法をおすすめしますが、リソースを大量に消費し、パフォーマンスに影響を与える可能性があるので注意してください。

MutateRows を使用してデータを削除するには、削除対象特定するフィルタ付きの readRows リクエストを送信し、続いて削除リクエストを送信します。使用可能なフィルタのリストについては、フィルタをご覧ください。

このセクションのサンプルでは、削除するデータがすでに決まっていることを前提としています。

列から削除する

次のコードサンプルでは、行内の列からすべてのセルを削除する方法を示します:

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

列ファミリーから削除する

次のコードサンプルでは、行の列ファミリーからセルを削除する方法を示します:

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

行から削除する

次のコード スニペットでは、行からすべてのセルを削除する方法を示します:

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

ストリーミングとバッチ処理で削除する

大量のデータを削除する場合は、ストリーミング リクエストして一括処理することが最適な方法です。この方法は、ガベージ コレクション ポリシーよりも細かいデータ保持要件がある場合に有効です。

以下のコード スニペットでは、データのストリーム(行の読み取り)を開始してバッチ化し、そのバッチを実行して cell_plan 列ファミリーの列 data_plan_01gb1 にあるすべてのセルを削除します:

Java

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

Bigtable 用のクライアント ライブラリをインストールして使用する方法については、Bigtable クライアント ライブラリをご覧ください。

Bigtable で認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

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

承認済みビューでデータを削除する

テーブルデータを削除するには、削除リクエストを承認済みビューに送信します。次のいずれかを使用する必要があります。

  • gcloud CLI
  • Java 用 Bigtable クライアント

承認済みビューからデータを削除する場合は、テーブル ID に加えて承認済みビュー ID を指定します。

承認済みビューから削除できるデータは、承認済みビューの定義で制限されます。承認済みビューに含まれるデータのみを削除できます。承認済みビューの定義の範囲外のデータまたは次のルールに該当するデータを削除しようとすると、PERMISSION_DENIED エラーが返されます。

  • 管理 API では、DropRowRange を使用して承認済みビューから特定の範囲の行を削除することはできません。
  • 行からの削除はサポートされていません。
  • 承認済みビューに含まれる行に対するものであれば、列からの削除がサポートされます。
  • 列ファミリーから削除できるのは、指定された列ファミリーが、承認済みビュー内ですべての列修飾子接頭辞(qualifier_prefixes="")を許可するように構成されている場合に限られます。

たとえば、指定した行から削除しようと試みた際に、その行に、基になるテーブルの列のうち承認済みビューにない列が含まれている場合、リクエストは失敗します。

次のステップ