Penghapusan

Dokumen ini menjelaskan cara menghapus data yang disimpan dalam tabel Bigtable, membahas kapan Anda harus menggunakan setiap pendekatan, dan memberikan contoh. Sebelum membaca halaman ini, Anda harus memahami ringkasan Bigtable dan memahami konsep yang terlibat dalam desain skema.

Agar konsisten, deskripsi di halaman ini merujuk pada metode API yang digunakan untuk setiap jenis permintaan. Namun, sebaiknya Anda selalu menggunakan salah satu library klien Bigtable untuk mengakses Bigtable API, bukan menggunakan REST atau RPC.

Contoh di halaman ini menggunakan data sampel yang mirip dengan data yang mungkin Anda simpan di Bigtable.

Untuk mengetahui berapa kali Anda dapat menggunakan operasi yang dijelaskan di halaman ini per hari, lihat Kuota dan batas.

Cara Bigtable menghapus data

Saat Anda mengirim permintaan penghapusan, sel ditandai untuk dihapus dan tidak dapat dibaca. Data akan dihapus hingga seminggu kemudian selama pemadatan, yaitu proses latar belakang yang terus mengoptimalkan tabel. Metadata penghapusan dapat menyebabkan data Anda menggunakan ruang penyimpanan yang sedikit lebih besar (beberapa KB per baris) selama beberapa hari setelah Anda mengirim permintaan penghapusan, hingga pemadatan berikutnya terjadi.

Anda dapat mengirim permintaan penghapusan kapan saja, meskipun cluster Anda telah melampaui batas penyimpanan dan operasi baca dan tulis diblokir.

Menghapus rentang baris

Jika Anda ingin menghapus data dalam jumlah besar yang disimpan dalam baris yang berdekatan, gunakan dropRowRange. Operasi ini menghapus semua baris untuk rentang baris yang diidentifikasi oleh baris awal dan akhir atau awalan kunci baris.

Nilai kunci baris yang Anda berikan saat menghapus rentang baris diperlakukan sebagai data layanan. Untuk mengetahui informasi tentang cara data layanan ditangani, lihat Google Cloud Pemberitahuan Privasi.

Setelah penghapusan berhasil diselesaikan dan Anda menerima respons, Anda dapat menulis data dengan aman ke rentang baris yang sama.

Operasi dropRowRange memiliki batasan berikut:

  • Anda tidak dapat melepaskan rentang baris dari tampilan yang diotorisasi.
  • Anda tidak dapat memanggil metode dropRowRange secara asinkron. Jika Anda mengirim permintaan dropRowRange ke tabel saat permintaan lain sedang berlangsung, Bigtable akan menampilkan error UNAVAILABLE dengan pesan A DropRowRange operation is already ongoing. Untuk mengatasi error, kirim permintaan lagi.
  • Dengan instance yang menggunakan replikasi, perlu diketahui bahwa Bigtable mungkin memerlukan waktu yang lama untuk menyelesaikan operasi karena peningkatan latensi replikasi dan penggunaan CPU. Untuk menghapus data dari instance yang menggunakan replikasi, gunakan Data API untuk membaca, lalu menghapus data Anda.

Contoh kode berikut menunjukkan cara menghilangkan rentang baris yang dimulai dengan awalan kunci baris phone#5c10102:

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menghapus data menggunakan metode Data API

Jika Anda perlu menghapus sejumlah kecil data yang tidak berdekatan, menghapus data menggunakan metode yang memanggil Cloud Bigtable API (Data API) sering kali merupakan pilihan terbaik. Gunakan metode ini jika Anda menghapus data dalam MB, bukan GB, dalam permintaan. Penggunaan Data API adalah satu-satunya cara untuk menghapus data dari kolom (bukan family kolom).

Metode Data API memanggil MutateRows dengan salah satu dari tiga jenis mutasi:

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Permintaan penghapusan menggunakan Data API bersifat atomik: permintaan berhasil dan semua data dihapus, atau permintaan gagal dan tidak ada data yang dihapus.

Dalam sebagian besar kasus, hindari penggunaan metode CheckAndMutate untuk menghapus data. Dalam kasus yang jarang terjadi saat Anda memerlukan konsistensi yang kuat, Anda dapat menggunakan pendekatan ini, tetapi perlu diketahui bahwa pendekatan ini membutuhkan banyak resource dan performa mungkin terpengaruh.

Untuk menggunakan MutateRows guna menghapus data, Anda mengirim permintaan readRows dengan filter untuk menentukan apa yang ingin Anda hapus, lalu Anda mengirim permintaan penghapusan. Untuk mengetahui daftar filter yang tersedia, lihat Filter.

Contoh di bagian ini mengasumsikan bahwa Anda telah menentukan data yang akan dihapus.

Menghapus dari kolom

Contoh kode berikut menunjukkan cara menghapus semua sel dari kolom dalam baris:

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menghapus dari family kolom

Contoh kode berikut menunjukkan cara menghapus sel dari grup kolom dalam baris:

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menghapus dari baris

Cuplikan kode berikut menunjukkan cara menghapus semua sel dari baris:

Java

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menghapus dengan streaming dan batch

Mengalirkan dan mengelompokkan permintaan penghapusan sering kali merupakan cara terbaik untuk menghapus data dalam jumlah besar. Strategi ini dapat berguna jika Anda memiliki persyaratan retensi data yang lebih terperinci daripada yang diizinkan oleh kebijakan pengumpulan sampah.

Jika aplikasi Anda ditulis dalam Java, Anda dapat mengaktifkan kontrol alur penulisan batch saat mengirim penghapusan batch ke Bigtable. Untuk mengetahui informasi selengkapnya, lihat Kontrol alur penulisan batch dan Mengaktifkan kontrol alur penulisan batch.

Contoh kode berikut memulai aliran data (membaca baris), mengelompokkannya, lalu memproses kelompok tersebut dan menghapus semua sel di kolom data_plan_01gb1 dalam grup kolom cell_plan:

Go

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

// 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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Untuk mempelajari cara menginstal dan menggunakan library klien untuk Bigtable, lihat library klien Bigtable.

Untuk melakukan autentikasi ke Bigtable, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menghapus data dalam tampilan yang diizinkan

Anda dapat menghapus data tabel dengan mengirim permintaan penghapusan ke tampilan yang diberi otorisasi. Anda harus menggunakan salah satu dari berikut ini:

  • gcloud CLI
  • Klien Bigtable untuk Java

Saat menghapus data dari tampilan yang diotorisasi, Anda memberikan ID tampilan yang diotorisasi selain ID tabel.

Data yang dapat Anda hapus dari tampilan yang diizinkan dibatasi oleh definisi tampilan yang diizinkan. Anda hanya dapat menghapus data yang disertakan dalam tampilan yang diotorisasi. Jika Anda mencoba menghapus data yang berada di luar definisi tampilan yang diizinkan atau tunduk pada aturan berikut, error PERMISSION_DENIED akan ditampilkan:

  • Menghapus rentang baris dari tampilan yang diberi otorisasi menggunakan DropRowRange di Admin API tidak didukung.
  • Penghapusan dari baris tidak didukung.
  • Penghapusan dari kolom didukung selama untuk baris yang ada di tabel virtual yang diberi otorisasi.
  • Penghapusan dari grup kolom hanya diizinkan jika grup kolom yang ditentukan dikonfigurasi untuk mengizinkan semua awalan penentu kolom (qualifier_prefixes="") dalam tampilan yang diizinkan.

Misalnya, jika Anda mencoba menghapus dari baris tertentu, dan baris tersebut berisi kolom dalam tabel pokok yang tidak ada dalam tampilan yang diizinkan, permintaan akan gagal.

Langkah berikutnya