Eliminaciones

En este documento, se describe cómo borrar datos almacenados en tablas de Bigtable, se analizan cuándo debes usar cada enfoque y se proporcionan ejemplos. Antes de leer esta página, debes familiarizarte con la descripción general de Bigtable y comprender los conceptos involucrados en el diseño de esquemas.

A fin de mantener la coherencia, las descripciones de esta página hacen referencia a los métodos de la API que se usan para cada tipo de solicitud. Sin embargo, te recomendamos que siempre uses una de las bibliotecas cliente de Bigtable para acceder a las API de Bigtable, en lugar de usar REST o RPC.

En los ejemplos de esta página, se usan datos de muestra similares a los datos que puedes almacenar en Bigtable.

Para obtener información sobre la cantidad de veces que puedes usar las operaciones descritas en esta página por día, consulta Cuotas y límites.

Cómo borra los datos Bigtable

Cuando envías una solicitud de eliminación, las celdas se marcan para su eliminación y no se pueden leer. Los datos se quitan hasta una semana después durante la compactación, un proceso en segundo plano que optimiza la tabla de manera continua. Los metadatos de eliminación pueden hacer que tus datos ocupen un poco más de espacio (varios KB por fila) durante algunos días después de enviar una solicitud de eliminación, hasta que se realice la siguiente compactación.

Puedes enviar una solicitud de eliminación en cualquier momento, incluso si tu clúster excedió el límite de almacenamiento y las operaciones de lectura y escritura están bloqueadas.

Cómo borrar un rango de filas

Si deseas borrar una gran cantidad de datos almacenados en filas contiguas, usa dropRowRange. Esta operación borra todas las filas de un rango de filas identificadas por una fila inicial y final o un prefijo de clave de fila.

Los valores de clave de fila que proporcionas cuando borras un rango de filas se tratan como datos del servicio. Para obtener información sobre cómo se manejan los datos del servicio, consulta el Aviso de Privacidad de Google Cloud.

Después de que se completa una eliminación correcta y recibes una respuesta, puedes escribir datos de forma segura en el mismo rango de filas.

La operación dropRowRange tiene las siguientes restricciones:

  • No puedes descartar un rango de filas desde una vista autorizada.
  • No puedes llamar al método dropRowRange de forma asíncrona. Si envías una solicitud dropRowRange a una tabla mientras hay otra solicitud en curso, Bigtable muestra un error. Para resolver el error, vuelve a enviar la solicitud.
  • Con las instancias que usan la replicación, ten en cuenta que Bigtable puede tardar mucho tiempo en completar la operación debido al aumento de la latencia de replicación y al uso de CPU. Si quieres borrar datos de una instancia que usa la replicación, usa la API de datos para leer y borrar tus datos.

En las siguientes muestras de código, se indica cómo descartar un rango de filas que comienzan con el prefijo de clave de fila phone#5c10102:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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");
    }
  }
}

Sincronización de Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Borra datos con los métodos de la API de datos

Si necesitas borrar pequeñas cantidades de datos no contiguos, borrar los datos con un método que llame a la API de Cloud Bigtable (API de Data) suele ser la mejor opción. Usa estos métodos si deseas borrar MB, no GB, de datos en una solicitud. El uso de la API de datos es la única forma de borrar datos de una columna (no de la familia de columnas).

Los métodos de la API de datos llaman a MutateRows con uno de los tres tipos de mutación:

  • DeleteFromColumn
  • DeleteFromFamily
  • DeleteFromRow

Una solicitud de eliminación que usa la API de datos es atómica: se realiza correctamente y se borran todos los datos, o bien falla y no se quitan datos.

En la mayoría de los casos, evita usar métodos CheckAndMutate para borrar datos. En el caso poco frecuente de que necesites una coherencia sólida, te recomendamos usar este enfoque, pero ten en cuenta que requiere muchos recursos y que el rendimiento puede verse afectado.

Si quieres usar MutateRows para borrar datos, debes enviar una solicitud readRows con un filtro a fin de determinar lo que deseas borrar y, luego, enviar la solicitud de eliminación. Para obtener una lista de los filtros disponibles, consulta Filtros.

En las muestras de esta sección, se supone que ya determinaste qué datos borrar.

Borrar de una columna

En las siguientes muestras de código, se indica cómo borrar todas las celdas de una columna en una fila:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Sincronización de Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Borrar de una familia de columnas

En las siguientes muestras de código, se indica cómo borrar celdas de una familia de columnas en una fila:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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"));
    }
  }
}

Sincronización de Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Borrar de una fila

En los siguientes fragmentos de código, se muestra cómo borrar todas las celdas de una fila:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Sincronización de Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Borra por transmisión y procesamiento por lotes

La mejor manera de borrar grandes cantidades de datos suele ser transmitir y agrupar en lotes tus solicitudes de eliminación. Esta estrategia puede ser útil cuando tienes requisitos de retención de datos más detallados que los que permiten las políticas de recolección de elementos no utilizados.

Los siguientes fragmentos de código inician una transmisión de datos (filas de lectura), los agrupan por lotes y, luego, pasan por el lote y borran todas las celdas de la columna data_plan_01gb1 en la familia de columnas cell_plan:

Java

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Sincronización de Python

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Para obtener información sobre cómo instalar y usar la biblioteca cliente de Bigtable, consulta Bibliotecas cliente de Bigtable.

Para autenticarte en Bigtable, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Borra datos en una vista autorizada

Para borrar datos de tablas, puedes enviar una solicitud de eliminación a una vista autorizada. Debes usar una de las siguientes opciones:

  • gcloud CLI
  • Cliente de Bigtable para Java

Cuando borras datos de una vista autorizada, proporcionas el ID de la vista autorizada, además del ID de la tabla.

Los datos que puedes borrar de una vista autorizada están limitados por la definición de vista autorizada. Solo puedes borrar datos que se incluyen en la vista autorizada. Si intentas borrar datos que están fuera de la definición de vista autorizada o que están sujetos a las siguientes reglas, se mostrará un error PERMISSION_DENIED:

  • No se admite la eliminación de un rango de filas de una vista autorizada con DropRowRange en la API de Admin.
  • No se pueden borrar datos de una fila.
  • Se admite la eliminación de una columna, siempre y cuando sea para las filas que están en la vista autorizada.
  • Solo se pueden borrar datos de una familia de columnas si la familia de columnas especificada está configurada para permitir todos los prefijos del calificador de columna (qualifier_prefixes="") en la vista autorizada.

Por ejemplo, si intentas borrar una fila especificada y esa fila contiene columnas de la tabla subyacente que no están en tu vista autorizada, la solicitud falla.

¿Qué sigue?