C++ hello world

This example is a simple "hello world" application, written in C++, thatillustrates how to do the following:

  • Set up authentication
  • Connect to a Bigtable instance.
  • Create a new table.
  • Write data to the table.
  • Read the data back.
  • Delete the table.

Set up authentication

To use the C++ samples on this page in a local development environment, install and initialize the gcloud CLI, and then set up Application Default Credentials with your user credentials.

    Install the Google Cloud CLI.

    If you're using an external identity provider (IdP), you must first sign in to the gcloud CLI with your federated identity.

    If you're using a local shell, then create local authentication credentials for your user account:

    gcloudauthapplication-defaultlogin

    You don't need to do this if you're using Cloud Shell.

    If an authentication error is returned, and you are using an external identity provider (IdP), confirm that you have signed in to the gcloud CLI with your federated identity.

For more information, see Set up authentication for a local development environment.

Running the sample

This example uses theCloud Bigtable package oftheGoogle Cloud client library for C++ to communicate withBigtable.

To run this sample program, follow theinstructions on GitHub.

Using the Google Cloud client library with Bigtable

The sample application connects to Bigtable and demonstrates somesimple operations.

Installing and importing the client library

Download or clone theBigtable C++ client library from GitHub, then compile it. Follow the compilerinstructions on the top-levelREADME.

Include the required headers.

#include"google/cloud/bigtable/admin/bigtable_table_admin_client.h"#include"google/cloud/bigtable/resource_names.h"#include"google/cloud/bigtable/table.h"

Connecting to Bigtable

UseMakeBigtableTableAdminConnection() toconstruct aBigtableTableAdminClient, whichyou will use to create a table.

// Connect to the Cloud Bigtable Admin API.cbta::BigtableTableAdminClienttable_admin(cbta::MakeBigtableTableAdminConnection());//! [connect data]// Create an object to access the Cloud Bigtable Data API.cbt::Tabletable(cbt::MakeDataConnection(),cbt::TableResource(project_id,instance_id,table_id));//! [connect data]

Creating a table

Define a schema for the table that has one column family. Set agarbage collection rule for the column family to keep a maximum of one versionof each value. Use that schema to instantiate a table object usingBigtableTableAdminClient::CreateTable(). Then create a dataclient that you can use to get data in and out of your table.

Note: Columns that are related to one another are typically grouped into a column family. For more information about column families, see theBigtable storage model.
// Define the desired schema for the Table.google::bigtable::admin::v2::Tablet;auto&families=*t.mutable_column_families();families["family"].mutable_gc_rule()->set_max_num_versions(1);// Create a table.std::stringinstance_name=cbt::InstanceName(project_id,instance_id);StatusOr<google::bigtable::admin::v2::Table>schema=table_admin.CreateTable(instance_name,table_id,std::move(t));

Writing rows to a table

Loop through a list of greeting strings to create some new rows for the table.In each iteration, useSingleRowMutation to definea row and assign it a row key and value. Then callTable::Apply() to apply the mutation to the row.

std::vector<std::string>greetings{"Hello World!","Hello Cloud Bigtable!","Hello C++!"};inti=0;for(autoconst&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-designstd::stringrow_key="key-"+std::to_string(i);google::cloud::Statusstatus=table.Apply(cbt::SingleRowMutation(std::move(row_key),cbt::SetCell("family","c0",greeting)));if(!status.ok())throwstd::runtime_error(status.message());++i;}

Creating a filter

Before you read the data that you wrote, create a filter,usingFilter::ColumnRangeClosed(),to limit the data that Bigtable returns. This filter tellsBigtable to return only the most recent version of each value,even if the table contains older cells that have expired but have not yet beenremoved by garbage collection.

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

Reading a row by its key

Call theTable::ReadRow() function, passing in the row key and the filter,to get one version of each value in that row.

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

Scanning all table rows

UseTable::ReadRows() to read a range of rowsfrom the table.

for(auto&row:table.ReadRows(cbt::RowRange::InfiniteRange(),cbt::Filter::PassAllFilter())){if(!row)throwstd::move(row).status();std::cout <<row->row_key() <<":\n";for(cbt::Cellconst&c:row->cells()){std::cout <<"\t" <<c.family_name() <<":" <<c.column_qualifier()              <<"    @ " <<c.timestamp().count() <<"us\n"              <<"\t\"" <<c.value() <<'"' <<"\n";}}

Deleting a table

Delete the table withBigtableTableAdminClient::DeleteTable().

google::cloud::Statusstatus=table_admin.DeleteTable(table.table_name());if(!status.ok())throwstd::runtime_error(status.message());

Putting it all together

Here is the full example without comments.

#include"google/cloud/bigtable/admin/bigtable_table_admin_client.h"#include"google/cloud/bigtable/resource_names.h"#include"google/cloud/bigtable/table.h"#include"google/cloud/bigtable/examples/bigtable_examples_common.h"#include"google/cloud/bigtable/testing/random_names.h"#include"google/cloud/internal/getenv.h"#include"google/cloud/internal/random.h"#include"google/cloud/log.h"#include <iostream>namespace{using::google::cloud::bigtable::examples::Usage;voidBigtableHelloWorld(std::vector<std::string>const&argv){if(argv.size()!=3){throwUsage{"hello-world <project-id> <instance-id> <table-id>"};}std::stringconst&project_id=argv[0];std::stringconst&instance_id=argv[1];std::stringconst&table_id=argv[2];namespacecbt=::google::cloud::bigtable;namespacecbta=::google::cloud::bigtable_admin;using::google::cloud::StatusOr;cbta::BigtableTableAdminClienttable_admin(cbta::MakeBigtableTableAdminConnection());cbt::Tabletable(cbt::MakeDataConnection(),cbt::TableResource(project_id,instance_id,table_id));google::bigtable::admin::v2::Tablet;auto&families=*t.mutable_column_families();families["family"].mutable_gc_rule()->set_max_num_versions(1);std::stringinstance_name=cbt::InstanceName(project_id,instance_id);StatusOr<google::bigtable::admin::v2::Table>schema=table_admin.CreateTable(instance_name,table_id,std::move(t));std::vector<std::string>greetings{"Hello World!","Hello Cloud Bigtable!","Hello C++!"};inti=0;for(autoconst&greeting:greetings){std::stringrow_key="key-"+std::to_string(i);google::cloud::Statusstatus=table.Apply(cbt::SingleRowMutation(std::move(row_key),cbt::SetCell("family","c0",greeting)));if(!status.ok())throwstd::runtime_error(status.message());++i;}cbt::Filterfilter=cbt::Filter::ColumnRangeClosed("family","c0","c0");StatusOr<std::pair<bool,cbt::Row>>result=table.ReadRow("key-0",filter);if(!result)throwstd::move(result).status();if(!result->first){std::cout <<"Cannot find row 'key-0' in the table: " <<table.table_name()              <<"\n";return;}cbt::Cellconst&cell=result->second.cells().front();std::cout <<cell.family_name() <<":" <<cell.column_qualifier() <<"    @ "            <<cell.timestamp().count() <<"us\n"            <<'"' <<cell.value() <<'"' <<"\n";for(auto&row:table.ReadRows(cbt::RowRange::InfiniteRange(),cbt::Filter::PassAllFilter())){if(!row)throwstd::move(row).status();std::cout <<row->row_key() <<":\n";for(cbt::Cellconst&c:row->cells()){std::cout <<"\t" <<c.family_name() <<":" <<c.column_qualifier()                <<"    @ " <<c.timestamp().count() <<"us\n"                <<"\t\"" <<c.value() <<'"' <<"\n";}}google::cloud::Statusstatus=table_admin.DeleteTable(table.table_name());if(!status.ok())throwstd::runtime_error(status.message());}voidRunAll(std::vector<std::string>const&argv){namespaceexamples=::google::cloud::bigtable::examples;namespacecbt=::google::cloud::bigtable;if(!argv.empty())throwUsage{"auto"};if(!examples::RunAdminIntegrationTests())return;examples::CheckEnvironmentVariablesAreSet({"GOOGLE_CLOUD_PROJECT","GOOGLE_CLOUD_CPP_BIGTABLE_TEST_INSTANCE_ID",});autoconstproject_id=google::cloud::internal::GetEnv("GOOGLE_CLOUD_PROJECT").value();autoconstinstance_id=google::cloud::internal::GetEnv("GOOGLE_CLOUD_CPP_BIGTABLE_TEST_INSTANCE_ID").value();autogenerator=google::cloud::internal::DefaultPRNG(std::random_device{}());autotable_id=cbt::testing::RandomTableId(generator);std::cout <<"\nRunning the BigtableHelloWorld() example" <<std::endl;BigtableHelloWorld({project_id,instance_id,table_id});}}// namespaceintmain(intargc,char*argv[])try{google::cloud::bigtable::examples::Exampleexample({{"auto",RunAll},{"hello-world",BigtableHelloWorld},});returnexample.Run(argc,argv);}catch(std::exceptionconst&ex){std::cerr <<ex.what() <<"\n";::google::cloud::LogSink::Instance().Flush();return1;}

Except as otherwise noted, the content of this page is licensed under theCreative Commons Attribution 4.0 License, and code samples are licensed under theApache 2.0 License. For details, see theGoogle Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates.

Last updated 2026-02-19 UTC.