ガベージ コレクションの構成
このページでは、Cloud Bigtable でガベージ コレクション ポリシーを表示、設定、更新する方法について説明します。このページを読む前に、ガベージ コレクションについて理解しておく必要があります。
cbt command-line tool
を使用する前に、.cbtrc
ファイルの作成手順を含む設定手順を行ってください。
現在のガベージ コレクション ポリシーを表示する
列ファミリーのガベージ コレクション ポリシーを表示するには、Google Cloud コンソールまたは cbt tool
を使用します。
コンソール
列ファミリーの現在のガベージ コレクション ポリシーを表示するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
テーブルの行にある [edit 編集] をクリックします。
表示する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
ガベージ コレクション ポリシーを確認したら、[キャンセル] をクリックして終了します。
cbt
TABLE_ID
の代わりに有効なテーブル ID を使用し、次のコマンドを実行して、特定のテーブルの現在のガベージ コレクション ポリシーを検索できます。
cbt ls TABLE_ID
ガベージ コレクション ポリシーを設定する
ガベージ コレクション ポリシーを設定するには、Google Cloud Console、cbt command-line tool
または Cloud Bigtable のクライアント ライブラリを使用します。
存続期間に基づくガベージ コレクション
次のセクションでは、列ファミリーのデータに最大存続期間を設定する方法について説明します。
Console
列ファミリー内のセルの有効期限を設定するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
[edit 編集] をクリックします。
編集する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
経過時間ベースのポリシーを選択します。
経過時間を入力します。[最長] テキスト ボックスに数値を入力し、[単位] プルダウンから時間の単位を選択します。
たとえば、列ファミリーのデータを 30 分間保持する場合は、「30」と入力して [分] を選択します。
[保存] をクリックします。
cbt
この例では、cf1
という名前の列ファミリーを作成してから、列ファミリーに含まれるデータの最大存続期間を 5 日間に設定します。これにより、この列ファミリーのすべての列で 5 日間を超えたデータをすべて削除するよう Bigtable に指示します。
cbt createfamily your-table cf1
cbt setgcpolicy your-table cf1 maxage=5d
Go
import (
"context"
"fmt"
"io"
"time"
"cloud.google.com/go/bigtable"
)
func createFamilyGCMaxAge(w io.Writer, projectID, instanceID string, tableName string) error {
// projectID := "my-project-id"
// instanceID := "my-instance-id"
// tableName := "my-table-name"
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, projectID, instanceID)
if err != nil {
return fmt.Errorf("bigtable.NewAdminClient: %v", err)
}
defer adminClient.Close()
columnFamilyName := "cf1"
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
return fmt.Errorf("CreateColumnFamily(%s): %v", columnFamilyName, err)
}
// Set a garbage collection policy of 5 days.
maxAge := time.Hour * 24 * 5
policy := bigtable.MaxAgePolicy(maxAge)
if err := adminClient.SetGCPolicy(ctx, tableName, columnFamilyName, policy); err != nil {
return fmt.Errorf("SetGCPolicy(%s): %v", policy, err)
}
fmt.Fprintf(w, "created column family %s with policy: %v\n", columnFamilyName, policy)
return nil
}
HBase
このコードサンプルは準備中です。
Java
// Creates a column family with GC policy : maximum age
// where age = current time minus cell timestamp
// Defines the GC rule to retain data with max age of 5 days.
DurationRule maxAgeRule = GCRULES.maxAge(5, TimeUnit.DAYS);
// Creates column family with given GC rule.
try {
// ModifyColumnFamiliesRequest can be used both for adding and modifying families, here it is
// being used to add a family
ModifyColumnFamiliesRequest columnFamiliesRequest =
ModifyColumnFamiliesRequest.of(tableId).addFamily(COLUMN_FAMILY_1, maxAgeRule);
adminClient.modifyFamilies(columnFamiliesRequest);
System.out.println("Created column family: " + COLUMN_FAMILY_1);
} catch (AlreadyExistsException e) {
System.err.println(
"Failed to create column family with rule, already exists: " + e.getMessage());
}
Python
print("Creating column family cf1 with with MaxAge GC Rule...")
# Create a column family with GC policy : maximum age
# where age = current time minus cell timestamp
# Define the GC rule to retain data with max age of 5 days
max_age_rule = column_family.MaxAgeGCRule(datetime.timedelta(days=5))
column_family1 = table.column_family("cf1", max_age_rule)
column_family1.create()
print("Created column family cf1 with MaxAge GC Rule.")
C#
// Create a column family with GC policy : maximum age
// where age = current time minus cell timestamp
// Initialize request argument(s).
// Define the GC rule to retain data with max age of 5 days
GcRule MaxAgeRule = new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5.0)) };
// Column family to create
ColumnFamily columnFamily = new ColumnFamily { GcRule = MaxAgeRule };
TableName tableName = new TableName(projectId, instanceId, tableId);
// Modification to create column family
ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification
{
Create = columnFamily,
Id = "cf1"
};
ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest
{
TableName = tableName,
Modifications = { modification }
};
try
{
// Make the request
Table response = bigtableTableAdminClient.ModifyColumnFamilies(request);
Console.WriteLine("Created column family");
// Print table information.
GetTable(tableId);
}
catch (Exception ex)
{
Console.WriteLine($"Error creating column family {ex.Message}");
}
C++
namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::bigtable::admin::v2::ModifyColumnFamiliesRequest;
using ::google::cloud::StatusOr;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
std::string const& instance_id, std::string const& table_id,
std::string const& family_name) {
std::string table_name = cbt::TableName(project_id, instance_id, table_id);
auto constexpr kSecondsPerDay =
std::chrono::seconds(std::chrono::hours(24)).count();
ModifyColumnFamiliesRequest::Modification mod;
mod.set_id(family_name);
mod.mutable_create()->mutable_gc_rule()->mutable_max_age()->set_seconds(
5 * kSecondsPerDay);
StatusOr<google::bigtable::admin::v2::Table> schema =
admin.ModifyColumnFamilies(table_name, {std::move(mod)});
if (!schema) throw std::move(schema).status();
std::cout << "Schema modified to: " << schema->DebugString() << "\n";
}
Node.js
// Create a column family with GC policy : maximum age
// where age = current time minus cell timestamp
// Define the GC rule to retain data with max age of 5 days
const maxAgeRule = {
rule: {
age: {
// Value must be atleast 1 millisecond
seconds: 60 * 60 * 24 * 5,
nanos: 0,
},
},
};
let [family] = await table.createFamily('cf1', maxAgeRule);
console.log(`Created column family ${family.id}`);
PHP
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\GcRule;
use Google\Protobuf\Duration;
/**
* Create a new column family with a max age GC rule
*
* @param string $projectId The Google Cloud project ID
* @param string $instanceId The ID of the Bigtable instance where the table resides
* @param string $tableId The ID of the table in which the rule needs to be created
*/
function create_family_gc_max_age(
string $projectId,
string $instanceId,
string $tableId
): void {
$tableAdminClient = new BigtableTableAdminClient();
$tableName = $tableAdminClient->tableName($projectId, $instanceId, $tableId);
print('Creating column family cf1 with MaxAge GC Rule...' . PHP_EOL);
// Create a column family with GC policy : maximum age
// where age = current time minus cell timestamp
$columnFamily1 = new ColumnFamily();
$duration = new Duration();
$duration->setSeconds(3600 * 24 * 5);
$MaxAgeRule = (new GcRule())->setMaxAge($duration);
$columnFamily1->setGcRule($MaxAgeRule);
$columnModification = new Modification();
$columnModification->setId('cf1');
$columnModification->setCreate($columnFamily1);
$tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
print('Created column family cf1 with MaxAge GC Rule.' . PHP_EOL);
}
Ruby
# Create a column family with GC policy : maximum age
# where age = current time minus cell timestamp
# NOTE: Age value must be atleast 1 millisecond
max_age_rule = Google::Cloud::Bigtable::GcRule.max_age 60 * 60 * 24 * 5
column_families = table.column_families do |cfs|
cfs.add "cf1", gc_rule: max_age_rule
end
family = column_families["cf1"]
バージョン数に基づくガベージ コレクション
以下のセクションでは、保持するデータのバージョン数またはセル数を指定するガベージ コレクション ポリシーを適用した列ファミリーの作成方法を説明します。
Console
列ファミリーに保持するセルまたはバージョンの数を設定するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
テーブルの行にある [edit 編集] をクリックします。
編集する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
バージョンベースのポリシーを選択します。
列ファミリーのすべての列に含めるセルの数を入力します。
[保存] をクリックします。
cbt
この例では、cf2
という名前の列ファミリーを作成してから、列ファミリーに保持するバージョンの数を 2 に設定します。これにより、この列ファミリーのすべての列で、直近 2 個のセルを除くすべてのセルを削除するよう Bigtable に指示します。
cbt createfamily your-table cf2
cbt setgcpolicy your-table cf2 maxversions=2
この例では、最新のセルを除くすべてのセルを削除するポリシーを設定します。
cbt setgcpolicy your-table cf2 maxversions=1
Go
import (
"context"
"fmt"
"io"
"cloud.google.com/go/bigtable"
)
func createFamilyGCMaxVersions(w io.Writer, projectID, instanceID string, tableName string) error {
// projectID := "my-project-id"
// instanceID := "my-instance-id"
// tableName := "my-table-name"
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, projectID, instanceID)
if err != nil {
return fmt.Errorf("bigtable.NewAdminClient: %v", err)
}
defer adminClient.Close()
columnFamilyName := "cf2"
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
return fmt.Errorf("CreateColumnFamily(%s): %v", columnFamilyName, err)
}
// Set a garbage collection policy of 2 versions.
policy := bigtable.MaxVersionsPolicy(2)
if err := adminClient.SetGCPolicy(ctx, tableName, columnFamilyName, policy); err != nil {
return fmt.Errorf("SetGCPolicy(%s): %v", policy, err)
}
fmt.Fprintf(w, "created column family %s with policy: %v\n", columnFamilyName, policy)
return nil
}
HBase
このコードサンプルは準備中です。
Java
// Creates a column family with GC policy : most recent N versions
// where 1 = most recent version
// Defines the GC policy to retain only the most recent 2 versions.
VersionRule versionRule = GCRULES.maxVersions(2);
// Creates column family with given GC rule.
try {
// ModifyColumnFamiliesRequest can be used both for adding and modifying families, here it is
// being used to add a family
ModifyColumnFamiliesRequest columnFamiliesRequest =
ModifyColumnFamiliesRequest.of(tableId).addFamily(COLUMN_FAMILY_2, versionRule);
adminClient.modifyFamilies(columnFamiliesRequest);
System.out.println("Created column family: " + COLUMN_FAMILY_2);
} catch (AlreadyExistsException e) {
System.err.println(
"Failed to create column family with rule, already exists: " + e.getMessage());
}
Python
print("Creating column family cf2 with max versions GC rule...")
# Create a column family with GC policy : most recent N versions
# where 1 = most recent version
# Define the GC policy to retain only the most recent 2 versions
max_versions_rule = column_family.MaxVersionsGCRule(2)
column_family2 = table.column_family("cf2", max_versions_rule)
column_family2.create()
print("Created column family cf2 with Max Versions GC Rule.")
C#
// Create a column family with GC policy : most recent N versions
// where 1 = most recent version
// Initialize request argument(s).
// Define the GC policy to retain only the most recent 2 versions
GcRule maxVersionsRule = new GcRule { MaxNumVersions = 2 };
// Column family to create
ColumnFamily columnFamily = new ColumnFamily { GcRule = maxVersionsRule };
TableName tableName = new TableName(projectId, instanceId, tableId);
// Modification to create column family
ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification
{
Create = columnFamily,
Id = "cf2"
};
ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest
{
TableName = tableName,
Modifications = { modification }
};
try
{
// Make the request
Table response = bigtableTableAdminClient.ModifyColumnFamilies(request);
Console.WriteLine("Created column family");
}
catch (Exception ex)
{
Console.WriteLine($"Error creating column family {ex.Message}");
}
C++
namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::bigtable::admin::v2::ModifyColumnFamiliesRequest;
using ::google::cloud::StatusOr;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
std::string const& instance_id, std::string const& table_id,
std::string const& family_name) {
std::string table_name = cbt::TableName(project_id, instance_id, table_id);
ModifyColumnFamiliesRequest::Modification mod;
mod.set_id(family_name);
mod.mutable_create()->mutable_gc_rule()->set_max_num_versions(2);
StatusOr<google::bigtable::admin::v2::Table> schema =
admin.ModifyColumnFamilies(table_name, {std::move(mod)});
if (!schema) throw std::move(schema).status();
std::cout << "Schema modified to: " << schema->DebugString() << "\n";
}
Node.js
// Create a column family with GC policy : most recent N versions
// where 1 = most recent version
// Define the GC policy to retain only the most recent 2 versions
const maxVersionsRule = {
rule: {
versions: 2,
},
};
// Create a column family with given GC rule
[family] = await table.createFamily('cf2', maxVersionsRule);
console.log(`Created column family ${family.id}`);
PHP
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\GcRule;
/**
* Create a new column family with a max versions GC rule
*
* @param string $projectId The Google Cloud project ID
* @param string $instanceId The ID of the Bigtable instance where the table resides
* @param string $tableId The ID of the table in which the rule needs to be created
*/
function create_family_gc_max_versions(
string $projectId,
string $instanceId,
string $tableId
): void {
$tableAdminClient = new BigtableTableAdminClient();
$tableName = $tableAdminClient->tableName($projectId, $instanceId, $tableId);
print('Creating column family cf2 with max versions GC rule...' . PHP_EOL);
$columnFamily2 = new ColumnFamily();
$maxVersionRule = (new GcRule())->setMaxNumVersions(2);
$columnFamily2->setGCRule($maxVersionRule);
$columnModification = new Modification();
$columnModification->setId('cf2');
$columnModification->setCreate($columnFamily2);
$tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
print('Created column family cf2 with Max Versions GC Rule.' . PHP_EOL);
}
Ruby
# Create a column family with GC policy : most recent N versions
# where 1 = most recent version
max_versions_rule = Google::Cloud::Bigtable::GcRule.max_versions 2
column_families = table.column_families do |cfs|
cfs.add "cf2", gc_rule: max_versions_rule
end
family = column_families["cf2"]
複数の条件に基づくガベージ コレクション
次のセクションでは、インターセクション ガベージ コレクション ポリシーを適用した列ファミリーを作成する方法について説明します。
Console
列ファミリーのセルにインターセクション ガベージ コレクション ポリシーを設定するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
テーブルの行にある [edit 編集] をクリックします。
編集する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
[カスタム ポリシー] を選択します。
テキスト領域にガベージ コレクション ルールを入力し、
maxage
、maxversions
、またはその両方に値を設定します。使用できる単位は ms、s、m、h、d です。これらは、ミリ秒、秒、分、時、日を表します。たとえば、5 日間を超え、かつ、直近の 2 個のセルより古いセルを削除するには、次のように入力します。削除対象のセルは、両方の条件を満たす必要があります。
maxage=5d and maxversions=2
[保存] をクリックします。
cbt
この例では、cf4
という名前の列ファミリーを作成してから、列ファミリーのすべての列について、5 日間を超え、かつ、直近 2 個のセルより古いセルを削除するガベージ コレクション ポリシーを設定します。削除対象のセルは、両方の条件を満たす必要があります。
cbt createfamily your-table cf4
cbt setgcpolicy your-table cf4 maxage=5d and maxversions=2
この例では、最新のセルを除き、14 日間を超えるすべてのセルを削除するポリシーを設定します。
cbt setgcpolicy your-table cf4 maxage=14d and maxversion=1
Go
import (
"context"
"fmt"
"io"
"time"
"cloud.google.com/go/bigtable"
)
func createFamilyGCIntersect(w io.Writer, projectID, instanceID string, tableName string) error {
// projectID := "my-project-id"
// instanceID := "my-instance-id"
// tableName := "my-table-name"
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, projectID, instanceID)
if err != nil {
return fmt.Errorf("bigtable.NewAdminClient: %v", err)
}
defer adminClient.Close()
columnFamilyName := "cf4"
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
return fmt.Errorf("CreateColumnFamily(%s): %v", columnFamilyName, err)
}
// GC rule: Drop cells older than 5 days AND older than the most recent 2 versions
maxAge := time.Hour * 24 * 5
maxAgePolicy := bigtable.MaxAgePolicy(maxAge)
policy := bigtable.IntersectionPolicy(bigtable.MaxVersionsPolicy(2), maxAgePolicy)
if err := adminClient.SetGCPolicy(ctx, tableName, columnFamilyName, policy); err != nil {
return fmt.Errorf("SetGCPolicy(%s): %v", policy, err)
}
fmt.Fprintf(w, "created column family %s with policy: %v\n", columnFamilyName, policy)
return nil
}
HBase
このコードサンプルは準備中です。
Java
// Creates a column family with GC policy to drop data that matches all conditions.
// Defines a GC rule to drop cells older than 5 days AND older than the most recent 2 versions.
DurationRule maxAgeRule = GCRULES.maxAge(5, TimeUnit.DAYS);
VersionRule versionRule = GCRULES.maxVersions(2);
IntersectionRule intersectionRule = GCRULES.intersection().rule(maxAgeRule).rule(versionRule);
// Creates column family with given GC rule.
try {
// ModifyColumnFamiliesRequest can be used both for adding and modifying families, here it is
// being used to add a family
ModifyColumnFamiliesRequest columnFamiliesRequest =
ModifyColumnFamiliesRequest.of(tableId).addFamily(COLUMN_FAMILY_4, intersectionRule);
adminClient.modifyFamilies(columnFamiliesRequest);
System.out.println("Created column family: " + COLUMN_FAMILY_4);
} catch (AlreadyExistsException e) {
System.err.println(
"Failed to create column family with rule, already exists: " + e.getMessage());
}
Python
print("Creating column family cf4 with Intersection GC rule...")
# Create a column family with GC policy to drop data that matches
# all conditions
# GC rule: Drop cells older than 5 days AND older than the most
# recent 2 versions
intersection_rule = column_family.GCRuleIntersection(
[
column_family.MaxAgeGCRule(datetime.timedelta(days=5)),
column_family.MaxVersionsGCRule(2),
]
)
column_family4 = table.column_family("cf4", intersection_rule)
column_family4.create()
print("Created column family cf4 with Intersection GC rule.")
C#
// Create a column family with GC policy to drop data that matches all conditions.
// Initialize request argument(s).
// GC rule: Drop cells older than 5 days AND older than the most recent 2 versions.
GcRule.Types.Intersection intersectionRule = new GcRule.Types.Intersection
{
Rules =
{
new GcRule { MaxNumVersions = 2 },
new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5)) }
}
};
GcRule gcRule = new GcRule { Intersection = intersectionRule };
// Column family to create
ColumnFamily columnFamily = new ColumnFamily { GcRule = gcRule };
TableName tableName = new TableName(projectId, instanceId, tableId);
// Modification to create column family
ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification
{
Create = columnFamily,
Id = "cf4"
};
ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest
{
TableName = tableName,
Modifications = { modification }
};
try
{
// Make the request
Table response = bigtableTableAdminClient.ModifyColumnFamilies(request);
Console.WriteLine("Created column family");
}
catch (Exception ex)
{
Console.WriteLine($"Error creating column family {ex.Message}");
}
C++
namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::bigtable::admin::v2::ModifyColumnFamiliesRequest;
using ::google::cloud::StatusOr;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
std::string const& instance_id, std::string const& table_id,
std::string const& family_name) {
std::string table_name = cbt::TableName(project_id, instance_id, table_id);
auto constexpr kSecondsPerDay =
std::chrono::seconds(std::chrono::hours(24)).count();
ModifyColumnFamiliesRequest::Modification mod;
mod.set_id(family_name);
auto& gc_int =
*mod.mutable_create()->mutable_gc_rule()->mutable_intersection();
gc_int.add_rules()->set_max_num_versions(1);
gc_int.add_rules()->mutable_max_age()->set_seconds(5 * kSecondsPerDay);
StatusOr<google::bigtable::admin::v2::Table> schema =
admin.ModifyColumnFamilies(table_name, {std::move(mod)});
if (!schema) throw std::move(schema).status();
std::cout << "Schema modified to: " << schema->DebugString() << "\n";
}
Node.js
// Create a column family with GC policy to drop data that matches all conditions
// GC rule: Drop cells older than 5 days AND older than the most recent 2 versions
const intersectionRule = {
rule: {
versions: 2,
age: {
seconds: 60 * 60 * 24 * 5,
nanos: 0,
},
intersection: true,
},
};
[family] = await table.createFamily('cf4', intersectionRule);
console.log(`Created column family ${family.id}`);
PHP
use Google\Cloud\Bigtable\Admin\V2\GcRule\Intersection as GcRuleIntersection;
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\GcRule;
use Google\Protobuf\Duration;
/**
* Create a new column family with an intersection GC rule
*
* @param string $projectId The Google Cloud project ID
* @param string $instanceId The ID of the Bigtable instance where the table resides
* @param string $tableId The ID of the table in which the rule needs to be created
*/
function create_family_gc_intersection(
string $projectId,
string $instanceId,
string $tableId
): void {
$tableAdminClient = new BigtableTableAdminClient();
$tableName = $tableAdminClient->tableName($projectId, $instanceId, $tableId);
print('Creating column family cf4 with Intersection GC rule...' . PHP_EOL);
$columnFamily4 = new ColumnFamily();
$intersectionRule = new GcRuleIntersection();
$intersectionArray = [
(new GcRule())->setMaxAge((new Duration())->setSeconds(3600 * 24 * 5)),
(new GcRule())->setMaxNumVersions(2)
];
$intersectionRule->setRules($intersectionArray);
$intersection = new GcRule();
$intersection->setIntersection($intersectionRule);
$columnFamily4->setGCRule($intersection);
$columnModification = new Modification();
$columnModification->setId('cf4');
$columnModification->setCreate($columnFamily4);
$tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
print('Created column family cf4 with Union GC rule' . PHP_EOL);
}
Ruby
# Create a column family with GC policy to drop data that matches at least
# one condition
max_age_rule = Google::Cloud::Bigtable::GcRule.max_age 60 * 60 * 24 * 5
max_versions_rule = Google::Cloud::Bigtable::GcRule.max_versions 2
intersection_gc_rule = Google::Cloud::Bigtable::GcRule.intersection max_age_rule, max_versions_rule
column_families = table.column_families do |cfs|
cfs.add "cf4", gc_rule: intersection_gc_rule
end
family = column_families["cf4"]
次のセクションでは、ユニオン ガベージ コレクション ポリシーを適用した列ファミリーの作成方法を説明します。
Console
列ファミリーのセルにユニオン ガベージ コレクション ポリシーを設定するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
テーブルの行にある [edit 編集] をクリックします。
編集する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
[カスタム ポリシー] を選択します。
テキスト領域にガベージ コレクション ルールを入力し、
maxage
、maxversions
、またはその両方に値を設定します。使用できる単位は ms、s、m、h、d です。これらは、ミリ秒、秒、分、時、日を表します。たとえば、5 日間を超えているか、または直近の 2 個のセルより古いセルを削除するには、次のように入力します。削除対象のセルは、いずれかの条件を満たす必要があります。
maxage=5d or maxversions=2
[保存] をクリックします。
cbt
この例では、cf3
という名前の列ファミリーを作成してから、5 日間を超えたセル、または、直近 2 個のセルより古いセルを削除するガベージ コレクション ポリシーを設定します。削除対象のセルは、いずれかの条件を満たす必要があります。
cbt createfamily your-table cf3
cbt setgcpolicy your-table cf3 maxage=5d or maxversions=2
この例では、最新のセルを除くすべてのセル値を削除する(ただし最新のセルであっても、1 秒間を超えるものは削除する)ポリシーを設定します。
cbt setgcpolicy your-table cf3 maxversions=1 or maxage=1s
Go
import (
"context"
"fmt"
"io"
"time"
"cloud.google.com/go/bigtable"
)
func createFamilyGCUnion(w io.Writer, projectID, instanceID string, tableName string) error {
// projectID := "my-project-id"
// instanceID := "my-instance-id"
// tableName := "my-table-name"
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, projectID, instanceID)
if err != nil {
return fmt.Errorf("bigtable.NewAdminClient: %v", err)
}
defer adminClient.Close()
columnFamilyName := "cf3"
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
return fmt.Errorf("CreateColumnFamily(%s): %v", columnFamilyName, err)
}
// Define a GC rule to drop cells older than 5 days or not the most recent version
maxAge := time.Hour * 24 * 5
maxAgePolicy := bigtable.MaxAgePolicy(maxAge)
policy := bigtable.UnionPolicy(bigtable.MaxVersionsPolicy(2), maxAgePolicy)
if err := adminClient.SetGCPolicy(ctx, tableName, columnFamilyName, policy); err != nil {
return fmt.Errorf("SetGCPolicy(%s): %v", policy, err)
}
fmt.Fprintf(w, "created column family %s with policy: %v\n", columnFamilyName, policy)
return nil
}
HBase
このコードサンプルは準備中です。
Java
// Creates a column family with GC policy to drop data that matches at least one condition.
// Defines a list of GC rules to drop cells older than 5 days OR not the most recent
// version.
UnionRule unionRule =
GCRULES.union().rule(GCRULES.maxAge(5, TimeUnit.DAYS)).rule(GCRULES.maxVersions(1));
// Creates column family with given GC rule.
try {
// ModifyColumnFamiliesRequest can be used both for adding and modifying families, here it is
// being used to add a family
ModifyColumnFamiliesRequest columnFamiliesRequest =
ModifyColumnFamiliesRequest.of(tableId).addFamily(COLUMN_FAMILY_3, unionRule);
adminClient.modifyFamilies(columnFamiliesRequest);
System.out.println("Created column family: " + COLUMN_FAMILY_3);
} catch (AlreadyExistsException e) {
System.err.println(
"Failed to create column family with rule, already exists: " + e.getMessage());
}
Python
print("Creating column family cf3 with union GC rule...")
# Create a column family with GC policy to drop data that matches
# at least one condition.
# Define a GC rule to drop cells older than 5 days or not the
# most recent version
union_rule = column_family.GCRuleUnion(
[
column_family.MaxAgeGCRule(datetime.timedelta(days=5)),
column_family.MaxVersionsGCRule(2),
]
)
column_family3 = table.column_family("cf3", union_rule)
column_family3.create()
print("Created column family cf3 with Union GC rule")
C#
// Create a column family with GC policy to drop data that matches at least one condition.
// Initialize request argument(s).
// Define a GC rule to drop cells older than 5 days or not the most recent version.
GcRule.Types.Union unionRule = new GcRule.Types.Union
{
Rules =
{
new GcRule { MaxNumVersions = 1 },
new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5)) }
}
};
GcRule gcRule = new GcRule { Union = unionRule };
// Column family to create
ColumnFamily columnFamily = new ColumnFamily { GcRule = gcRule };
TableName tableName = new TableName(projectId, instanceId, tableId);
// Modification to create column family
ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification
{
Create = columnFamily,
Id = "cf3"
};
ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest
{
TableName = tableName,
Modifications = { modification }
};
try
{
// Make the request
Table response = bigtableTableAdminClient.ModifyColumnFamilies(request);
Console.WriteLine("Created column family");
}
catch (Exception ex)
{
Console.WriteLine($"Error creating column family {ex.Message}");
}
C++
namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::bigtable::admin::v2::ModifyColumnFamiliesRequest;
using ::google::cloud::StatusOr;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
std::string const& instance_id, std::string const& table_id,
std::string const& family_name) {
std::string table_name = cbt::TableName(project_id, instance_id, table_id);
auto constexpr kSecondsPerDay =
std::chrono::seconds(std::chrono::hours(24)).count();
ModifyColumnFamiliesRequest::Modification mod;
mod.set_id(family_name);
auto& gc_union = *mod.mutable_create()->mutable_gc_rule()->mutable_union_();
gc_union.add_rules()->set_max_num_versions(1);
gc_union.add_rules()->mutable_max_age()->set_seconds(5 * kSecondsPerDay);
StatusOr<google::bigtable::admin::v2::Table> schema =
admin.ModifyColumnFamilies(table_name, {std::move(mod)});
if (!schema) throw std::move(schema).status();
std::cout << "Schema modified to: " << schema->DebugString() << "\n";
}
Node.js
// Create a column family with GC policy to drop data that matches at least one condition.
// Define a GC rule to drop cells older than 5 days or not the most recent version
const unionRule = {
rule: {
versions: 1,
age: {
seconds: 60 * 60 * 24 * 5,
nanos: 0,
},
union: true,
},
};
[family] = await table.createFamily('cf3', unionRule);
console.log(`Created column family ${family.id}`);
PHP
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\GcRule\Union as GcRuleUnion;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\GcRule;
use Google\Protobuf\Duration;
/**
* Create a new column family with a union GC rule
*
* @param string $projectId The Google Cloud project ID
* @param string $instanceId The ID of the Bigtable instance where the table resides
* @param string $tableId The ID of the table in which the rule needs to be created
*/
function create_family_gc_union(
string $projectId,
string $instanceId,
string $tableId
): void {
$tableAdminClient = new BigtableTableAdminClient();
$tableName = $tableAdminClient->tableName($projectId, $instanceId, $tableId);
print('Creating column family cf3 with union GC rule...' . PHP_EOL);
// Create a column family with GC policy to drop data that matches
// at least one condition.
// Define a GC rule to drop cells older than 5 days or not the
// most recent version
$columnFamily3 = new ColumnFamily();
$ruleUnion = new GcRuleUnion();
$ruleUnionArray = [
(new GcRule())->setMaxNumVersions(2),
(new GcRule())->setMaxAge((new Duration())->setSeconds(3600 * 24 * 5))
];
$ruleUnion->setRules($ruleUnionArray);
$union = new GcRule();
$union->setUnion($ruleUnion);
$columnFamily3->setGCRule($union);
$columnModification = new Modification();
$columnModification->setId('cf3');
$columnModification->setCreate($columnFamily3);
$tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
print('Created column family cf3 with Union GC rule.' . PHP_EOL);
}
Ruby
# Create a column family with GC policy to drop data that matches at least
# one condition
max_age_rule = Google::Cloud::Bigtable::GcRule.max_age 60 * 60 * 24 * 5
max_versions_rule = Google::Cloud::Bigtable::GcRule.max_versions 2
union_gc_rule = Google::Cloud::Bigtable::GcRule.union max_age_rule, max_versions_rule
column_families = table.column_families do |cfs|
cfs.add "cf3", gc_rule: union_gc_rule
end
family = column_families["cf3"]
次のセクションでは、ネストされたガベージ コレクション ポリシーを適用した列ファミリーの作成方法について説明します。ネストされたガベージ コレクション ポリシーは、ユニオンルールとインターセクション ルールからなります。
Console
列ファミリーのセルにネストされたガベージ コレクション ポリシーを設定するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
テーブルの行にある [edit 編集] をクリックします。
編集する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
[カスタム ポリシー] を選択します。
テキスト領域にガベージ コレクション ルールを入力し、
maxage
、maxversions
、またはその両方に値を設定します。使用できる単位は ms、s、m、h、d です。これらは、ミリ秒、秒、分、時、日を表します。たとえば、最新の 2 つのセルが 1 分以上経過していない場合でも、1 分間を超えるまで直近の 10 個のセルを保持する場合は、次のように入力します。
(maxage=1m and maxversions=2) or maxversions=10
[保存] をクリックします。
cbt
この例では、cf5
という名前の列ファミリーを作成してから、次の条件のいずれかを満たす列ファミリー内のセルを削除するガベージ コレクション ポリシーを設定します。
- 直近 10 個のセルより古い
- 1 分間を超え、かつ、直近 2 個のセルよりも古い
つまり、このポリシーは、1 分間を超えるセルであっても直近 2 個のセルを保持します。または、1 分間を超えるまで、直近 10 個のセルを保持します。
cbt createfamily your-table cf5
cbt setgcpolicy your-table cf5 "(maxage=1m and maxversions=2) or
maxversions=10"
Go
import (
"context"
"fmt"
"io"
"time"
"cloud.google.com/go/bigtable"
)
func createFamilyGCNested(w io.Writer, projectID, instanceID string, tableName string) error {
// projectID := "my-project-id"
// instanceID := "my-instance-id"
// tableName := "my-table-name"
ctx := context.Background()
adminClient, err := bigtable.NewAdminClient(ctx, projectID, instanceID)
if err != nil {
return fmt.Errorf("bigtable.NewAdminClient: %v", err)
}
defer adminClient.Close()
columnFamilyName := "cf5"
if err := adminClient.CreateColumnFamily(ctx, tableName, columnFamilyName); err != nil {
return fmt.Errorf("CreateColumnFamily(%s): %v", columnFamilyName, err)
}
// Create a nested GC rule:
// Drop cells that are either older than the 10 recent versions
// OR
// Drop cells that are older than a month AND older than the 2 recent versions
maxAge := time.Hour * 24 * 5
maxAgePolicy := bigtable.MaxAgePolicy(maxAge)
policy := bigtable.UnionPolicy(
bigtable.MaxVersionsPolicy(10),
bigtable.IntersectionPolicy(
bigtable.MaxVersionsPolicy(2),
maxAgePolicy))
if err := adminClient.SetGCPolicy(ctx, tableName, columnFamilyName, policy); err != nil {
return fmt.Errorf("SetGCPolicy(%s): %v", policy, err)
}
fmt.Fprintf(w, "created column family %s with policy: %v\n", columnFamilyName, policy)
return nil
}
HBase
このコードサンプルは準備中です。
Java
// Creates a nested GC rule:
// Drop cells that are either older than the 10 recent versions
// OR
// Drop cells that are older than a month AND older than the 2 recent versions
VersionRule versionRule1 = GCRULES.maxVersions(10);
VersionRule versionRule2 = GCRULES.maxVersions(2);
DurationRule maxAgeRule = GCRULES.maxAge(30, TimeUnit.DAYS);
IntersectionRule intersectionRule = GCRULES.intersection().rule(maxAgeRule).rule(versionRule2);
UnionRule unionRule = GCRULES.union().rule(intersectionRule).rule(versionRule1);
// Creates column family with given GC rule.
try {
// ModifyColumnFamiliesRequest can be used both for adding and modifying families, here it is
// being used to add a family
ModifyColumnFamiliesRequest columnFamiliesRequest =
ModifyColumnFamiliesRequest.of(tableId).addFamily(COLUMN_FAMILY_5, unionRule);
adminClient.modifyFamilies(columnFamiliesRequest);
System.out.println("Created column family: " + COLUMN_FAMILY_5);
} catch (AlreadyExistsException e) {
System.err.println(
"Failed to create column family with rule, already exists: " + e.getMessage());
}
Python
print("Creating column family cf5 with a Nested GC rule...")
# Create a column family with nested GC policies.
# Create a nested GC rule:
# Drop cells that are either older than the 10 recent versions
# OR
# Drop cells that are older than a month AND older than the
# 2 recent versions
rule1 = column_family.MaxVersionsGCRule(10)
rule2 = column_family.GCRuleIntersection(
[
column_family.MaxAgeGCRule(datetime.timedelta(days=30)),
column_family.MaxVersionsGCRule(2),
]
)
nested_rule = column_family.GCRuleUnion([rule1, rule2])
column_family5 = table.column_family("cf5", nested_rule)
column_family5.create()
print("Created column family cf5 with a Nested GC rule.")
C#
// Create a nested GC rule:
// Drop cells that are either older than the 10 recent versions
// OR
// Drop cells that are older than 5 days AND older than the 2 recent versions.
// Initialize request argument(s).
GcRule.Types.Intersection intersectionRule = new GcRule.Types.Intersection
{
Rules =
{
new GcRule { MaxNumVersions = 2 },
new GcRule { MaxAge = Duration.FromTimeSpan(TimeSpan.FromDays(5)) }
}
};
GcRule.Types.Union nestedRule = new GcRule.Types.Union
{
Rules =
{
new GcRule { MaxNumVersions = 10 },
new GcRule { Intersection = intersectionRule }
}
};
GcRule gcRule = new GcRule { Union = nestedRule };
// Column family to create
ColumnFamily columnFamily = new ColumnFamily { GcRule = gcRule };
TableName tableName = new TableName(projectId, instanceId, tableId);
// Modification to create column family
ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification
{
Create = columnFamily,
Id = "cf5"
};
ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest
{
TableName = tableName,
Modifications = { modification }
};
try
{
// Make the request
Table response = bigtableTableAdminClient.ModifyColumnFamilies(request);
Console.WriteLine("Created column family");
}
catch (Exception ex)
{
Console.WriteLine($"Error creating column family {ex.Message}");
}
C++
namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::bigtable::admin::v2::ModifyColumnFamiliesRequest;
using ::google::cloud::StatusOr;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
std::string const& instance_id, std::string const& table_id,
std::string const& family_name) {
std::string table_name = cbt::TableName(project_id, instance_id, table_id);
auto constexpr kSecondsPerDay =
std::chrono::seconds(std::chrono::hours(24)).count();
ModifyColumnFamiliesRequest::Modification mod;
mod.set_id(family_name);
auto& gc = *mod.mutable_create()->mutable_gc_rule();
auto& gc_1 = *gc.mutable_union_()->add_rules();
auto& gc_2 = *gc.mutable_union_()->add_rules();
auto& gc_2_1 = *gc_2.mutable_intersection()->add_rules();
auto& gc_2_2 = *gc_2.mutable_intersection()->add_rules();
gc_1.set_max_num_versions(10);
gc_2_1.set_max_num_versions(1);
gc_2_2.mutable_max_age()->set_seconds(5 * kSecondsPerDay);
StatusOr<google::bigtable::admin::v2::Table> schema =
admin.ModifyColumnFamilies(table_name, {std::move(mod)});
if (!schema) throw std::move(schema).status();
std::cout << "Schema modified to: " << schema->DebugString() << "\n";
}
Node.js
// Create a nested GC rule:
// Drop cells that are either older than the 10 recent versions
// OR
// Drop cells that are older than a month AND older than the 2 recent versions
const nestedRule = {
union: true,
versions: 10,
rule: {
versions: 2,
age: {
// one month
seconds: 60 * 60 * 24 * 30,
nanos: 0,
},
},
};
[family] = await table.createFamily('cf5', nestedRule);
console.log(`Created column family ${family.id}`);
PHP
use Google\Cloud\Bigtable\Admin\V2\GcRule\Intersection as GcRuleIntersection;
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\GcRule\Union as GcRuleUnion;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\GcRule;
use Google\Protobuf\Duration;
/**
* Create a new column family with a nested GC rule
*
* @param string $projectId The Google Cloud project ID
* @param string $instanceId The ID of the Bigtable instance where the table resides
* @param string $tableId The ID of the table in which the rule needs to be created
*/
function create_family_gc_nested(
string $projectId,
string $instanceId,
string $tableId
): void {
$tableAdminClient = new BigtableTableAdminClient();
$tableName = $tableAdminClient->tableName($projectId, $instanceId, $tableId);
print('Creating column family cf5 with a Nested GC rule...' . PHP_EOL);
// Create a column family with nested GC policies.
// Create a nested GC rule:
// Drop cells that are either older than the 10 recent versions
// OR
// Drop cells that are older than a month AND older than the
// 2 recent versions
$columnFamily5 = new ColumnFamily();
$rule1 = (new GcRule())->setMaxNumVersions(10);
$rule2Intersection = new GcRuleIntersection();
$rule2Duration1 = new Duration();
$rule2Duration1->setSeconds(3600 * 24 * 30);
$rule2Array = [
(new GcRule())->setMaxAge($rule2Duration1),
(new GcRule())->setMaxNumVersions(2)
];
$rule2Intersection->setRules($rule2Array);
$rule2 = new GcRule();
$rule2->setIntersection($rule2Intersection);
$nestedRule = new GcRuleUnion();
$nestedRule->setRules([
$rule1,
$rule2
]);
$nestedRule = (new GcRule())->setUnion($nestedRule);
$columnFamily5->setGCRule($nestedRule);
$columnModification = new Modification();
$columnModification->setId('cf5');
$columnModification->setCreate($columnFamily5);
$tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
print('Created column family cf5 with a Nested GC rule.' . PHP_EOL);
}
Ruby
# Create a nested GC rule:
# Drop cells that are either older than the 10 recent versions
# OR
# Drop cells that are older than a month AND older than the 2 recent versions
max_versions_rule1 = Google::Cloud::Bigtable::GcRule.max_versions 10
max_age_rule = Google::Cloud::Bigtable::GcRule.max_age 60 * 60 * 24 * 5
max_versions_rule2 = Google::Cloud::Bigtable::GcRule.max_versions 2
intersection_gc_rule = Google::Cloud::Bigtable::GcRule.intersection max_age_rule, max_versions_rule2
nested_gc_rule = Google::Cloud::Bigtable::GcRule.union max_versions_rule1, intersection_gc_rule
ガベージ コレクション ポリシーを更新する
次のセクションでは、既存のガベージ コレクション ポリシーを変更する方法について説明します。
Console
列ファミリーのガベージ コレクション ポリシーを更新するには:
Google Cloud コンソールで Bigtable インスタンスのリストを開きます。
テーブルを表示するインスタンスをクリックします。
左ペインで [テーブル] をクリックします。
[テーブル] ページに、インスタンス内のテーブルのリストが表示されます。
テーブルの行にある [edit 編集] をクリックします。
編集する列ファミリーの横にある [keyboard_arrow_down 開く] をクリックします。
[保存] をクリックします。
cbt
cbt setgcpolicy your-table cf1 maxage=1d
Go
このコードサンプルは準備中です。
HBase
このコードサンプルは準備中です。
Java
// Updates the column family metadata to update the GC rule.
// Updates a column family GC rule.
VersionRule versionRule = GCRULES.maxVersions(1);
try {
// ModifyColumnFamiliesRequest can be used both for adding and modifying families, here it is
// being used to modify a family
// Updates column family with given GC rule.
ModifyColumnFamiliesRequest updateRequest =
ModifyColumnFamiliesRequest.of(tableId).updateFamily(COLUMN_FAMILY_1, versionRule);
adminClient.modifyFamilies(updateRequest);
System.out.printf("Column family %s GC rule updated%n", COLUMN_FAMILY_1);
} catch (NotFoundException e) {
System.err.println("Failed to modify a non-existent column family: " + e.getMessage());
}
Python
print("Updating column family cf1 GC rule...")
# Update the column family cf1 to update the GC rule
column_family1 = table.column_family("cf1", column_family.MaxVersionsGCRule(1))
column_family1.update()
print("Updated column family cf1 GC rule\n")
C#
// Update the column family metadata to update the GC rule.
// Initialize request argument(s).
// Updated column family GC rule.
GcRule maxVersionsRule = new GcRule { MaxNumVersions = 1 };
// Column family to create
ColumnFamily columnFamily = new ColumnFamily { GcRule = maxVersionsRule };
TableName tableName = new TableName(projectId, instanceId, tableId);
// Modification to update column family
ModifyColumnFamiliesRequest.Types.Modification modification = new ModifyColumnFamiliesRequest.Types.Modification
{
Update = columnFamily,
Id = "cf1"
};
ModifyColumnFamiliesRequest request = new ModifyColumnFamiliesRequest
{
TableName = tableName,
Modifications = { modification }
};
try
{
// Make the request
Table response = bigtableTableAdminClient.ModifyColumnFamilies(request);
Console.WriteLine("Updated column family");
}
catch (Exception ex)
{
Console.WriteLine($"Error updating column family {ex.Message}");
}
C++
namespace cbt = ::google::cloud::bigtable;
namespace cbta = ::google::cloud::bigtable_admin;
using ::google::bigtable::admin::v2::ModifyColumnFamiliesRequest;
using ::google::cloud::StatusOr;
[](cbta::BigtableTableAdminClient admin, std::string const& project_id,
std::string const& instance_id, std::string const& table_id,
std::string const& family_name) {
std::string table_name = cbt::TableName(project_id, instance_id, table_id);
ModifyColumnFamiliesRequest::Modification mod;
mod.set_id(family_name);
mod.mutable_update()->mutable_gc_rule()->set_max_num_versions(1);
StatusOr<google::bigtable::admin::v2::Table> schema =
admin.ModifyColumnFamilies(table_name, {std::move(mod)});
if (!schema) throw std::move(schema).status();
std::cout << "Schema modified to: " << schema->DebugString() << "\n";
}
Node.js
// Update the column family metadata to update the GC rule
// Create a reference to the column family
family = table.family('cf1');
// Update a column family GC rule
const updatedMetadata = {
rule: {
versions: 1,
},
};
const [apiResponse] = await family.setMetadata(updatedMetadata);
console.log(`Updated GC rule: ${JSON.stringify(apiResponse)}`);
PHP
use Google\Cloud\Bigtable\Admin\V2\ModifyColumnFamiliesRequest\Modification;
use Google\Cloud\Bigtable\Admin\V2\BigtableTableAdminClient;
use Google\Cloud\Bigtable\Admin\V2\ColumnFamily;
use Google\Cloud\Bigtable\Admin\V2\GcRule;
use Google\ApiCore\ApiException;
/**
* Update the GC Rule for an existing column family in the table
*
* @param string $projectId The Google Cloud project ID
* @param string $instanceId The ID of the Bigtable instance
* @param string $tableId The ID of the table where the rule needs to be updated
* @param string $familyId The ID of the column family
*/
function update_gc_rule(
string $projectId,
string $instanceId,
string $tableId,
string $familyId = 'cf3'
): void {
$tableAdminClient = new BigtableTableAdminClient();
$tableName = $tableAdminClient->tableName($projectId, $instanceId, $tableId);
$columnFamily1 = new ColumnFamily();
printf('Updating column family %s GC rule...' . PHP_EOL, $familyId);
$columnFamily1->setGcRule((new GcRule())->setMaxNumVersions(1));
// Update the column family with ID $familyId to update the GC rule
$columnModification = new Modification();
$columnModification->setId($familyId);
$columnModification->setUpdate($columnFamily1);
try {
$tableAdminClient->modifyColumnFamilies($tableName, [$columnModification]);
} catch (ApiException $e) {
if ($e->getStatus() === 'NOT_FOUND') {
printf('Column family %s does not exist.' . PHP_EOL, $familyId);
return;
}
throw $e;
}
printf('Print column family %s GC rule after update...' . PHP_EOL, $familyId);
printf('Column Family: ' . $familyId . PHP_EOL);
printf('%s' . PHP_EOL, $columnFamily1->serializeToJsonString());
}
Ruby
gc_rule = Google::Cloud::Bigtable::GcRule.max_versions 1
column_families = table.column_families do |cfs|
cfs.update "cf1", gc_rule: gc_rule
end
p column_families["cf1"]