範例:C++「Hello World」應用程式

本範例是以 C++ 編寫的簡易「hello world」應用程式,說明如何執行以下操作:

  • 連線至 Cloud BigTable 執行個體。
  • 建立新的資料表。
  • 將資料寫入資料表。
  • 讀取資料。
  • 刪除資料表。

執行範例

本範例使用 C++ 適用的 Google Cloud 用戶端程式庫Cloud Bigtable 套件,與 Cloud Bigtable 進行通訊。

如要執行這個範例程式,請按照 GitHub 上的操作說明進行。

搭配 Cloud BigTable 使用 Cloud 用戶端程式庫

範例應用程式會連線至 Cloud Bigtable,示範部分簡易作業。

安裝及匯入用戶端程式庫

從 GitHub 下載或複製 Cloud BigTable C++ 用戶端程式庫,然後進行編譯。按照頂層 README 上的編譯器操作說明進行操作。

加入必要的標頭。

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

連線至 Cloud BigTable

使用 TableAdmin.CreateDefaultAdminClient() 建立將用於建立資料表的管理用戶端。

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

建立資料表

為具有一個資料欄系列的資料表定義結構定義,並為該資料欄系列設定垃圾收集規則,讓每個值最多只有一個版本。利用該結構定義使用 TableAdmin.CreateTable() 將資料表物件實例化,然後建立一個資料用戶端,以便將資料輸入和輸出資料表。

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

將資料列寫入資料表

循環處理問候語字串清單,以在資料表中建立一些新的資料列。在每個疊代作業中,使用 SingleRowMutation() 定義資料列,並為其指派資料列索引鍵和值。然後呼叫 Table.Apply(),將變異套用到該資料列。

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

建立篩選器

讀取已寫入的資料前,請先使用 Filter.ColumnRangeClosed() 建立篩選器,藉此限制 Cloud BigTable 傳回的資料。即使資料表中含有每個值尚未經過垃圾收集處理的較舊版本,篩選器仍能指示 Cloud BigTable 僅傳回每個值的最新版本。

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

依索引鍵讀取資料列

呼叫 Table.ReadRow() 函式傳入資料列索引鍵和篩選器,以取得該資料列中每個值的一個版本。

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

掃描所有的資料表列

使用 Table.ReadRows() 讀取資料表中特定範圍的資料列。

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

刪除資料表

使用 DeleteTable() 刪除資料表。

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

完整的程式碼範例

以下是沒有註解的完整範例。



#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;
}
本頁內容對您是否有任何幫助?請提供意見:

傳送您對下列選項的寶貴意見...

這個網頁
Cloud Bigtable 說明文件