Penghapusan

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

Agar konsisten, deskripsi pada halaman ini merujuk pada metode API yang yang digunakan untuk setiap jenis permintaan. Namun, kami sangat menyarankan agar Anda selalu gunakan salah satu klien Bigtable library untuk mengakses Bigtable API daripada menggunakan REST atau RPC.

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

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

Cara Bigtable menghapus data

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

Anda dapat mengirim permintaan penghapusan kapan saja, meskipun cluster Anda telah melampaui batas penyimpanan, sementara 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 dengan baris awal dan akhir atau awalan kunci baris.

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

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

Operasi dropRowRange memiliki batasan berikut:

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

Contoh kode berikut menunjukkan cara melepaskan 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 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 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 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. 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 kolom keluarga).

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

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

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

Pada umumnya, hindari penggunaan metode CheckAndMutate untuk menghapus data. Dalam kasus langka peristiwa yang memerlukan konsistensi kuat, Anda mungkin ingin menggunakan Namun perlu diketahui bahwa cara ini membutuhkan sumber daya yang intensif dan kinerja mungkin terdampak.

Agar dapat menggunakan MutateRows untuk menghapus data, kirim permintaan readRows dengan filter untuk menentukan apa yang ingin Anda hapus, lalu Anda mengirimkan file permintaan. 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 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 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()

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

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

asyncio 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 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 informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menghapus dengan streaming dan pengelompokan

Streaming dan pengelompokan permintaan penghapusan sering kali merupakan cara terbaik untuk menghapus data dalam jumlah besar. Strategi ini dapat bermanfaat ketika Anda memiliki gambaran persyaratan retensi data daripada yang diizinkan oleh kebijakan pembersihan sampah memori.

Cuplikan kode berikut memulai aliran data (membaca baris), kelompokkan, lalu masuk ke kelompok dan hapus semua sel di kolom data_plan_01gb1 pada 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 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 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)

asyncio 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 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 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 pada tampilan yang diizinkan

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

  • gcloud CLI
  • Klien Bigtable untuk Java

Jika Anda menghapus data dari tampilan yang diotorisasi, Anda harus menyediakan ID tampilan yang diotorisasi, selain ID tabel.

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

  • Menghapus rentang baris dari tampilan yang diizinkan menggunakan DropRowRange dalam Admin API tidak didukung.
  • Menghapus dari baris tidak didukung.
  • Menghapus dari kolom didukung selama itu untuk baris yang berada di tampilan yang diotorisasi.
  • Menghapus dari kelompok kolom hanya diizinkan jika kelompok kolom yang ditentukan dikonfigurasi untuk mengizinkan semua awalan penentu kolom (qualifier_prefixes="") dalam tampilan yang diotorisasi.

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

Langkah selanjutnya