Penghapusan

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

Agar konsisten, deskripsi pada halaman ini merujuk ke metode API yang digunakan untuk setiap jenis permintaan. Namun, sebaiknya selalu gunakan 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 mempelajari berapa kali Anda dapat menggunakan operasi yang dijelaskan pada 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 dihapus hingga seminggu kemudian selama pemadatan, proses latar belakang yang terus mengoptimalkan tabel. Metadata penghapusan dapat menyebabkan data Anda menggunakan lebih banyak ruang (beberapa kb per baris) selama beberapa hari setelah Anda mengirim permintaan penghapusan, hingga pemadatan berikutnya terjadi.

Anda selalu dapat mengirim permintaan penghapusan, meskipun cluster Anda telah melampaui batas penyimpanan serta 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 akan diperlakukan sebagai data layanan. Untuk mengetahui informasi tentang cara penanganan data layanan, lihat Pemberitahuan Privasi Google Cloud.

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

Operasi dropRowRange memiliki batasan berikut:

  • Anda tidak dapat menghapus 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 ini, kirim permintaan lagi.
  • Pada instance yang menggunakan replikasi, perlu diketahui bahwa Bigtable mungkin memerlukan waktu lama untuk menyelesaikan operasi karena adanya peningkatan latensi replikasi dan penggunaan CPU. Untuk menghapus data dari instance yang menggunakan replikasi, gunakan Data API untuk membaca, lalu menghapus data.

Contoh kode berikut menunjukkan cara menghapus 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):
    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

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 MB, bukan GB, data dalam permintaan. Menggunakan Data API adalah satu-satunya cara untuk menghapus data dari kolom (bukan kelompok 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 akan dihapus, atau permintaan gagal dan tidak ada data yang dihapus.

Pada umumnya, hindari penggunaan metode CheckAndMutate untuk menghapus data. Dalam peristiwa yang jarang terjadi yang memerlukan konsistensi kuat, Anda dapat menggunakan pendekatan ini, tetapi perlu diketahui bahwa pendekatan ini menghabiskan banyak resource dan performa mungkin terpengaruh.

Agar dapat menggunakan MutateRows untuk menghapus data, Anda mengirimkan permintaan readRows dengan filter untuk menentukan apa yang ingin Anda hapus, lalu kirimkan permintaan penghapusan. Untuk 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 satu 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):
    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

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):
    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 grup kolom

Contoh kode berikut menunjukkan cara menghapus sel dari grup kolom secara berturut-turut:

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

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):
    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 sebuah 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):
    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

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

Hapus menurut streaming dan pengelompokan

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

Cuplikan kode berikut memulai aliran data (membaca baris), mengelompokkannya, lalu melakukan batch, dan menghapus semua sel di kolom data_plan_01gb1 dalam kelompok kolom cell_plan:

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

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):
    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 di tampilan yang diizinkan

Anda dapat menghapus data tabel dengan mengirimkan permintaan penghapusan ke tampilan yang diizinkan. Anda harus menggunakan salah satu dari hal berikut:

  • gcloud CLI
  • Klien Bigtable untuk Java

Saat menghapus data dari tampilan yang diotorisasi, Anda harus memberikan ID tampilan yang sah 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 di 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 diizinkan menggunakan DropRowRange dalam admin API tidak didukung.
  • Menghapus dari baris tidak didukung.
  • Penghapusan dari kolom didukung selama tindakan ini dilakukan untuk baris yang berada dalam tampilan yang diizinkan.
  • Menghapus 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 sah, permintaan akan gagal.

Langkah selanjutnya