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.
// 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.