삭제

이 문서에서는 Bigtable 테이블에 저장된 데이터를 삭제하는 방법과 각 방식을 사용해야 하는 경우를 논의하고 예시를 제공합니다. 이 페이지를 읽기 전에 Bigtable 개요에 익숙하고 스키마 설계에 포함된 개념을 이해하고 있어야 합니다.

일관성을 위해 이 페이지의 설명에서는 각 요청 유형에 사용되는 API 메서드를 참조합니다. 그러나 REST 또는 RPC를 사용하는 대신 항상 Bigtable 클라이언트 라이브러리 중 하나를 사용하여 Bigtable API에 액세스하는 것이 좋습니다.

이 페이지의 예시에서는 Bigtable에 저장할 수 있는 데이터와 비슷한 샘플 데이터를 사용합니다.

매일 이 페이지에 설명된 작업을 사용할 수 있는 횟수는 할당량 및 한도를 참조하세요.

Bigtable의 데이터 삭제 방법

삭제 요청을 전송하면 셀이 삭제용으로 표시되고 셀을 읽을 수 없습니다. 테이블을 지속적으로 최적화하는 백그라운드 프로세스인 압축이 수행되는 최대 1주 후까지 데이터가 삭제됩니다. 삭제 메타데이터로 인해 다음 압축이 수행될 때까지 삭제 요청을 전송한 후 며칠 동안은 데이터가 행당 몇 kb 정도로 약간 더 많은 공간을 차지할 수 있습니다.

클러스터가 스토리지 한도를 초과하고 읽기 및 쓰기가 차단되더라도 항상 삭제 요청을 전송할 수 있습니다.

행 범위 삭제

연속된 행에 저장된 대량의 데이터를 삭제하려면 dropRowRange를 사용합니다. 이 작업은 시작 및 종료 행 또는 row key 프리픽스로 식별된 행 범위의 모든 행을 삭제합니다.

행 범위를 삭제할 때 제공하는 row key 값은 서비스 데이터로 취급됩니다. 서비스 데이터 처리 방법에 대한 자세한 내용은 Google Cloud 개인정보처리방침을 참조하세요.

삭제가 성공적으로 완료되고 응답이 수신되면 데이터를 동일한 행 범위에 안전하게 작성할 수 있습니다.

dropRowRange 작업에는 다음과 같은 제한사항이 있습니다.

  • 승인된 뷰에서 행 범위를 삭제할 수 없습니다.
  • dropRowRange 메서드는 비동기적으로 호출할 수 없습니다. 다른 요청이 진행되는 동안 테이블에 dropRowRange 요청을 보내면 Bigtable은 A DropRowRange operation is already ongoing 메시지와 함께 UNAVAILABLE 오류를 반환합니다. 오류를 해결하려면 요청을 다시 보내세요.
  • 복제를 사용하는 인스턴스의 경우 복제 지연 시간 및 CPU 사용량 증가로 인해 Bigtable이 작업을 완료하는 데 시간이 오래 걸릴 수 있습니다. 복제를 사용하는 인스턴스에서 데이터를 삭제하려면 Data API를 사용하여 데이터를 읽은 후 삭제합니다.

다음 코드 샘플은 row key 프리픽스 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):
    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

Bigtable용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Bigtable 클라이언트 라이브러리를 참조하세요.

Bigtable에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

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

Data API 메서드를 사용하여 데이터 삭제

연속적이지 않은 소량의 데이터를 삭제해야 할 경우에는 Cloud Bigtable API(Data API)를 호출하는 메서드를 사용하여 데이터를 삭제하는 것이 가장 좋은 방법인 경우가 많습니다. 요청에서 GB가 아닌 MB 단위로 데이터를 삭제하는 경우 이 방법을 사용합니다. 열에서 데이터를 삭제하기 위해서는 Data API를 사용하는 것이 유일한 방법입니다(column family가 아님).

세 가지 변형 유형 중 하나를 포함하는 Data API 메서드 호출 MutateRows:

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Data API를 사용하는 삭제 요청은 원자적입니다. 요청이 성공하고 모든 데이터가 삭제되거나 요청이 실패하고 데이터가 삭제되지 않습니다.

대부분의 경우 데이터 삭제를 위해 CheckAndMutate 메서드를 사용하지 않는 것이 좋습니다. strong consistency가 필요한 드문 경우에는 이 접근 방식을 사용할 수 있지만 리소스 소비가 높고 성능에 영향을 줄 수 있음을 알고 있어야 합니다.

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

Bigtable용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Bigtable 클라이언트 라이브러리를 참조하세요.

Bigtable에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

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

column family에서 삭제

다음 코드 샘플은 행의 column family에서 셀을 삭제하는 방법을 보여줍니다.

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

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

Bigtable용 클라이언트 라이브러리를 설치하고 사용하는 방법은 Bigtable 클라이언트 라이브러리를 참조하세요.

Bigtable에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

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

스트리밍 및 일괄 처리로 삭제

대량의 데이터를 삭제할 때는 삭제 요청을 스트리밍 및 일괄 처리하는 것이 가장 좋은 방법인 경우가 많습니다. 이 전략은 가비지 수집 정책 허용보다 데이터 보관 요구사항을 미세 조정한 경우에 유용할 수 있습니다.

다음 코드 스니펫은 데이터 스트림(행 읽기)을 시작하고, 이를 일괄 처리하고, 일괄 처리를 진행하고 cell_plan column family에서 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):
    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

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 오류가 반환됩니다.

  • Admin API의 DropRowRange를 사용하여 승인된 뷰에서 행 범위를 삭제할 수 없습니다.
  • 행에서 삭제는 지원되지 않습니다.
  • 열에서 삭제는 승인된 뷰에 있는 행의 경우에만 지원됩니다.
  • 지정된 column family가 승인된 뷰의 모든 column qualifier 프리픽스(qualifier_prefixes="")를 허용하도록 구성된 경우에만 column family에서 삭제가 허용됩니다.

예를 들어 지정된 행에서 삭제를 시도하고 해당 행에 승인된 뷰에 없는 기본 테이블의 열이 포함된 경우 요청이 실패합니다.

다음 단계