Ejemplo: aplicación “Hello World” en C++

En este ejemplo, se utiliza una aplicación simple llamada “Hello World”, escrita en C++, que indica cómo hacer lo siguiente:

  • Conectarse a una instancia de Cloud Bigtable
  • Crear una tabla nueva.
  • Escribir datos en la tabla.
  • Volver a leer datos.
  • Borrar la tabla.

Ejecuta la muestra

En este ejemplo, se usa el paquete de Cloud Bigtable de la biblioteca cliente de Google para C++ con el fin de comunicarse con Cloud Bigtable.

Para ejecutar este programa de muestra, sigue las instrucciones que se indican en GitHub.

Usa la biblioteca cliente de Cloud con Cloud Bigtable

La aplicación de muestra se conecta con Cloud Bigtable y demuestra algunas operaciones simples.

Instala y, luego, importa la biblioteca cliente

Descarga o clona la biblioteca cliente de Cloud Bigtable para C++ de GitHub, y luego compílala. Sigue las instrucciones del compilador en el README de nivel superior.

Incluye los encabezados requeridos.

#include "google/cloud/bigtable/table.h"
#include "google/cloud/bigtable/table_admin.h"

Conéctate con Cloud Bigtable

Utiliza TableAdmin.CreateDefaultAdminClient() a fin de crear un cliente de administración que utilizarás para crear una tabla.

cbt::TableAdmin table_admin(
    cbt::CreateDefaultAdminClient(project_id, cbt::ClientOptions()),
    instance_id);

Crea una tabla

Define un esquema para la tabla que tiene una familia de columnas. Establece una regla de recolección de elementos no utilizados para que la familia de columnas mantenga un máximo de una versión de cada valor. Utiliza ese esquema para crear una instancia de un objeto de tabla utilizando TableAdmin.CreateTable(). Luego, crea un cliente de datos que puedas usar para obtener datos dentro y fuera de la tabla.

// Define the desired schema for the Table.
cbt::GcRule gc_rule = cbt::GcRule::MaxNumVersions(1);
cbt::TableConfig schema({{"family", gc_rule}}, {});

// Create a table.
StatusOr<google::bigtable::admin::v2::Table> returned_schema =
    table_admin.CreateTable(table_id, schema);

// Create an object to access the Cloud Bigtable Data API.
cbt::Table table(cbt::CreateDefaultDataClient(project_id, instance_id,
                                              cbt::ClientOptions()),
                 table_id);

Escribir filas en una tabla

Recorre una lista de strings de saludos a fin de crear filas nuevas en la tabla. En cada iteración, usa SingleRowMutation() para definir una fila y asignarle una clave de fila y un valor. Luego, llama a Table.Apply() para aplicar la mutación a la fila.

std::vector<std::string> greetings{"Hello World!", "Hello Cloud Bigtable!",
                                   "Hello C++!"};
int i = 0;
for (auto const& greeting : greetings) {
  // Each row has a unique row key.
  //
  // Note: This example uses sequential numeric IDs for simplicity, but
  // this can result in poor performance in a production application.
  // Since rows are stored in sorted order by key, sequential keys can
  // result in poor distribution of operations across nodes.
  //
  // For more information about how to design a Bigtable schema for the
  // best performance, see the documentation:
  //
  //     https://cloud.google.com/bigtable/docs/schema-design
  std::string row_key = "key-" + std::to_string(i);
  google::cloud::Status status = table.Apply(cbt::SingleRowMutation(
      std::move(row_key), cbt::SetCell("family", "c0", greeting)));

  if (!status.ok()) {
    throw std::runtime_error(status.message());
  }
  ++i;
}

Crea un filtro

Antes de leer los datos que escribiste, crea un filtro, usando Filter.ColumnRangeClosed(), para limitar los datos que muestre Cloud Bigtable. El filtro le indica a Cloud Bigtable que muestre solo la versión más reciente de cada valor, incluso si la tabla contiene versiones anteriores que no han pasado por el proceso de recolección de elementos no utilizados.

cbt::Filter filter = cbt::Filter::ColumnRangeClosed("family", "c0", "c0");

Lee una fila por su clave

Llama a la función Table.ReadRow(), pasando la clave de fila y el filtro, para obtener una versión de cada valor en esa fila.

StatusOr<std::pair<bool, cbt::Row>> result = table.ReadRow("key-0", filter);
if (!result) {
  throw std::runtime_error(result.status().message());
}
if (!result->first) {
  std::cout << "Cannot find row 'key-0' in the table: " << table.table_name()
            << "\n";
  return 0;
}
cbt::Cell const& cell = result->second.cells().front();
std::cout << cell.family_name() << ":" << cell.column_qualifier() << "    @ "
          << cell.timestamp().count() << "us\n"
          << '"' << cell.value() << '"' << "\n";

Analizar todas las filas de una tabla

Utiliza Table.ReadRows() para leer un rango de filas de la tabla.

for (StatusOr<cbt::Row> const& row : table.ReadRows(
         cbt::RowRange::InfiniteRange(), cbt::Filter::PassAllFilter())) {
  if (!row) {
    throw std::runtime_error(row.status().message());
  }
  std::cout << row->row_key() << ":\n";
  for (cbt::Cell const& cell : row->cells()) {
    std::cout << "\t" << cell.family_name() << ":" << cell.column_qualifier()
              << "    @ " << cell.timestamp().count() << "us\n"
              << "\t\"" << cell.value() << '"' << "\n";
  }
}

Borra una tabla

Borra la tabla con DeleteTable() .

google::cloud::Status status = table_admin.DeleteTable(table_id);
if (!status.ok()) {
  throw std::runtime_error(status.message());
}

Revisión general

Este es el ejemplo completo sin comentarios.


#include "google/cloud/bigtable/table.h"
#include "google/cloud/bigtable/table_admin.h"
#include <iostream>

int main(int argc, char* argv[]) try {
  if (argc != 4) {
    std::string const cmd = argv[0];
    auto last_slash = std::string(cmd).find_last_of('/');
    std::cerr << "Usage: " << cmd.substr(last_slash + 1)
              << " <project_id> <instance_id> <table_id>\n";
    return 1;
  }

  std::string const project_id = argv[1];
  std::string const instance_id = argv[2];
  std::string const table_id = argv[3];

  namespace cbt = google::cloud::bigtable;
  using google::cloud::StatusOr;

  cbt::TableAdmin table_admin(
      cbt::CreateDefaultAdminClient(project_id, cbt::ClientOptions()),
      instance_id);

  cbt::GcRule gc_rule = cbt::GcRule::MaxNumVersions(1);
  cbt::TableConfig schema({{"family", gc_rule}}, {});

  StatusOr<google::bigtable::admin::v2::Table> returned_schema =
      table_admin.CreateTable(table_id, schema);

  cbt::Table table(cbt::CreateDefaultDataClient(project_id, instance_id,
                                                cbt::ClientOptions()),
                   table_id);

  std::vector<std::string> greetings{"Hello World!", "Hello Cloud Bigtable!",
                                     "Hello C++!"};
  int i = 0;
  for (auto const& greeting : greetings) {
    std::string row_key = "key-" + std::to_string(i);
    google::cloud::Status status = table.Apply(cbt::SingleRowMutation(
        std::move(row_key), cbt::SetCell("family", "c0", greeting)));

    if (!status.ok()) {
      throw std::runtime_error(status.message());
    }
    ++i;
  }

  cbt::Filter filter = cbt::Filter::ColumnRangeClosed("family", "c0", "c0");

  StatusOr<std::pair<bool, cbt::Row>> result = table.ReadRow("key-0", filter);
  if (!result) {
    throw std::runtime_error(result.status().message());
  }
  if (!result->first) {
    std::cout << "Cannot find row 'key-0' in the table: " << table.table_name()
              << "\n";
    return 0;
  }
  cbt::Cell const& cell = result->second.cells().front();
  std::cout << cell.family_name() << ":" << cell.column_qualifier() << "    @ "
            << cell.timestamp().count() << "us\n"
            << '"' << cell.value() << '"' << "\n";

  for (StatusOr<cbt::Row> const& row : table.ReadRows(
           cbt::RowRange::InfiniteRange(), cbt::Filter::PassAllFilter())) {
    if (!row) {
      throw std::runtime_error(row.status().message());
    }
    std::cout << row->row_key() << ":\n";
    for (cbt::Cell const& cell : row->cells()) {
      std::cout << "\t" << cell.family_name() << ":" << cell.column_qualifier()
                << "    @ " << cell.timestamp().count() << "us\n"
                << "\t\"" << cell.value() << '"' << "\n";
    }
  }

  google::cloud::Status status = table_admin.DeleteTable(table_id);
  if (!status.ok()) {
    throw std::runtime_error(status.message());
  }

  return 0;
} catch (std::exception const& ex) {
  std::cerr << "Standard C++ exception raised: " << ex.what() << "\n";
  return 1;
}
¿Te sirvió esta página? Envíanos tu opinión:

Enviar comentarios sobre…

Documentación de Cloud Bigtable