OSS Tables は、Alibaba Cloud OSS が提供する構造化データレイクストレージサービスです。Apache Iceberg オープンテーブルフォーマットをベースに構築され、AI トレーニングデータや OLAP 分析向けに、費用対効果が高く、高パフォーマンスなストレージを提供します。コンパクション、スナップショット管理、孤立したファイルのクリーンアップなどの自動メンテナンス機能が組み込まれており、メンテナンス不要のサーバーレスデータレイクエクスペリエンスを実現します。
アクセスリクエスト
Object Storage Service (OSS) テーブルは、China (Hangzhou)、China (Shanghai)、China (Ulanqab)、China (Beijing)、China (Shenzhen)、Singapore、および Germany (Frankfurt) リージョンで、無料の招待制プレビューとして提供されています。このプレビューは、企業実名登録を完了したお客様のみが利用できます。アクセスをリクエストするには、Alibaba Cloud アカウントにサインインし、テーブルバケットリストページに移動します。プレビュー期間中は、想定外の料金を避けるため、課金通知をモニタリングしてください。
仕組み
OSS Tables は 3 層構造 (テーブルバケット、名前空間、テーブル) でデータを整理し、リソース隔離からテーブル管理まで、階層的な管理機能を提供します。
テーブルバケット:テーブルリソースを管理および隔離する最上位のリソースコンテナであり、クラウドリソースユニットです。タイプは customer で、ユーザーが作成した構造化データテーブルを格納します。テーブルバケットには、
acs:osstables:{region}:{uid}:bucket/{bucket-name}の形式で独自の Alibaba Cloud Resource Name (ARN) があります。名前空間:リレーショナルデータベースのスキーマのような、論理的な隔離レイヤーです。異なるビジネスドメインのテーブルをグループ化し、単一のテーブルバケット内で権限を隔離します。
テーブル:Apache Iceberg フォーマットで保存される実データテーブルです。各テーブルには、
acs:osstables:{region}:{uid}:bucket/{bucket-name}/table/{table-id}の形式で一意の ARN が割り当てられ、きめ細かい権限コントロールをサポートします。テーブルを作成する際はスキーマを指定する必要があります。サポートされるフィールドタイプは、long、string、timestamptz、boolean、int、float、double、decimal(P,S)、date、time、timestamp、uuid、binary、および fixed[L] です。
テーブルバケット
テーブルバケットは、OSS Tables の最上位のリソースコンテナです。Apache Iceberg フォーマットのテーブルを格納および管理します。
テーブルバケットの作成
1 つの Alibaba Cloud アカウントで、単一のリージョンに最大 10 個のテーブルバケットを作成できます。テーブルバケット名は、同じリージョン内で一意である必要があります。
コンソール
OSS コンソールにログインします。左側メニューで、[テーブルバケット一覧] を選択します。
[テーブルバケットの作成] をクリックします。
[テーブルバケットの作成] ダイアログボックスで、次のパラメーターを設定します。
名前:テーブルバケットの名前を入力します。名前は 3~32 文字で、小文字、数字、ハイフン (-) のみを使用できます。ハイフンで開始または終了することはできません。また、
oss、acs、aliyun、alibaba、awsといったプレフィックスで始めることはできません。リージョン:リージョン (例: [China (Beijing)]) を選択します。
データディレクトリフォーマット:デフォルト値は
icebergです。エンドポイント:選択したリージョンに基づいて自動的に生成されます。
冗長タイプ:現在の値は[ローカル冗長]です。
サーバー側の暗号化:[なし] または [AES256] を選択します。
[OK] をクリックします。
ossutil
次の ossutil コマンドでテーブルバケットを作成します。
ossutil tables-api create-table-bucket --name mytablebucketSDK
Python
次の Python SDK コードでテーブルバケットを作成します。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="create table bucket sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--name', help='テーブルバケットの名前。', required=True)
parser.add_argument('--sse-algorithm', help='サーバー側の暗号化アルゴリズム。')
parser.add_argument('--kms-key-arn', help='暗号化用の KMS キー ARN。')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
encryption_configuration = None
if args.sse_algorithm is not None or args.kms_key_arn is not None:
encryption_configuration = oss_tables.models.EncryptionConfiguration(
sse_algorithm=args.sse_algorithm,
kms_key_arn=args.kms_key_arn,
)
result = client.create_table_bucket(oss_tables.models.CreateTableBucketRequest(
name=args.name,
encryption_configuration=encryption_configuration,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' arn: {result.arn}')
if __name__ == "__main__":
main()Go
次の Go SDK コードでテーブルバケットを作成します。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットが配置されているリージョン。")
flag.StringVar(&name, "name", "", "テーブルバケットの名前。")
}
func main() {
flag.Parse()
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, bucket name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.CreateTableBucket(context.TODO(), &tables.CreateTableBucketRequest{
Name: oss.Ptr(name),
})
if err != nil {
log.Fatalf("failed to create table bucket %v", err)
}
log.Printf("create table bucket result:%#v\n", result)
}Java
次の Java SDK コードでテーブルバケットを作成します。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class CreateTableBucketSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String name = "mytablebucket";
String sseAlgorithm = "AES256";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
CreateTableBucketRequest.Builder requestBuilder = CreateTableBucketRequest.newBuilder()
.name(name);
EncryptionConfiguration encryptionConfig = EncryptionConfiguration.newBuilder()
.sseAlgorithm(sseAlgorithm)
.build();
requestBuilder.encryptionConfiguration(encryptionConfig);
CreateTableBucketResult result = client.createTableBucket(requestBuilder.build());
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Created table bucket with ARN: %s%n", result.arn());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
CreateTableBucket API を呼び出してテーブルバケットを作成します。
テーブルバケットが作成されると、デフォルトで自動 データメンテナンス 設定 (icebergUnreferencedFileRemoval) が有効になり、Iceberg テーブル内の未参照ファイルが自動的に削除されます。デフォルトのパラメーターは、unreferencedDays=3 (3 日以上参照されていないファイルを削除) と nonCurrentDays=10 (現在のバージョンではないファイルバージョンを 10 日間保持) です。
テーブルバケットの照会
コンソール
OSS コンソールにログインします。左側メニューで、[テーブルバケット一覧] を選択します。
テーブルバケットの名前をクリックして、詳細を表示します。
詳細ページで、次の基本情報を表示します。
バケット所有者アカウント ID:テーブルバケットを所有する Alibaba Cloud アカウントの ID。
リソース識別子 (ARN):テーブルバケットのグローバルに一意な ARN。
バケットタイプ:[Customer] と表示されます。これは、テーブルバケットがユーザーによって作成されたことを示します。
作成時刻:テーブルバケットが作成された時刻。
ストレージクラス:[標準 - ローカル冗長]と表示されます。
サーバー側の暗号化:現在の暗号化設定が表示されます。
ossutil
次の ossutil コマンドでテーブルバケットを照会します。
ossutil tables-api get-table-bucket --table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucketSDK
Python
次の Python SDK コードでテーブルバケットを照会します。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table bucket sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table_bucket(oss_tables.models.GetTableBucketRequest(
table_bucket_arn=args.table_bucket_arn,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' arn: {result.arn},'
f' name: {result.name},'
f' owner account id: {result.owner_account_id},'
f' created at: {result.created_at},'
f' table bucket id: {result.table_bucket_id},'
f' type: {result.type}')
if __name__ == "__main__":
main()Go
次の Go SDK コードでテーブルバケットを照会します。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetTableBucket(context.TODO(), &tables.GetTableBucketRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
})
if err != nil {
log.Fatalf("failed to get table bucket %v", err)
}
log.Printf("get table bucket result:%#v\n", result)
}Java
次の Java SDK コードでテーブルバケットを照会します。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableBucketSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetTableBucketResult result = client.getTableBucket(GetTableBucketRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.build());
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Table bucket ARN: %s%n", result.arn());
System.out.printf("Table bucket name: %s%n", result.name());
System.out.printf("Table bucket type: %s%n", result.type());
System.out.printf("Owner account ID: %s%n", result.ownerAccountId());
System.out.printf("Table bucket ID: %s%n", result.tableBucketId());
System.out.printf("Created at: %s%n", result.createdAt());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
GetTableBucket API を呼び出してテーブルバケットを照会します。
テーブルバケットの一覧表示
コンソール
OSS コンソールにログインします。左側メニューで、[テーブルバケット一覧] を選択します。
一覧ページで、アカウント内のすべてのテーブルバケットの名前、リージョン、作成時刻などの情報を確認できます。
ossutil
次の ossutil コマンドでテーブルバケットを一覧表示します。
ossutil tables-api list-table-bucketsSDK
Python
次の Python SDK コードでテーブルバケットを一覧表示します。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="list table buckets sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--prefix', help='テーブルバケットをフィルタリングするために使用されるプレフィックス。')
parser.add_argument('--max-buckets', help='返すテーブルバケットの最大数。', type=int)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.list_table_buckets(oss_tables.models.ListTableBucketsRequest(
prefix=args.prefix,
max_buckets=args.max_buckets,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' continuation token: {result.continuation_token}')
if result.table_buckets:
for i, bucket in enumerate(result.table_buckets):
print(f'bucket {i + 1}:'
f' arn: {bucket.arn},'
f' name: {bucket.name},'
f' id: {bucket.table_bucket_id},'
f' owner account id: {bucket.owner_account_id},'
f' created at: {bucket.created_at}')
if __name__ == "__main__":
main()Go
次の Go SDK コードでテーブルバケットを一覧表示します。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットが配置されているリージョン。")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
p := client.NewListTableBucketsPaginator(&tables.ListTableBucketsRequest{})
var i int
log.Println("Table Buckets:")
for p.HasNext() {
i++
page, err := p.NextPage(context.TODO())
if err != nil {
log.Fatalf("failed to get page %v, %v", i, err)
}
// 見つかったテーブルバケットをログに出力します
for _, b := range page.TableBuckets {
log.Printf("Table Bucket %v,%v,%v,%v,%v,%v\n", oss.ToString(b.Name), oss.ToString(b.Arn), oss.ToString(b.OwnerAccountId), oss.ToString(b.TableBucketId), oss.ToString(b.CreatedAt), oss.ToString(b.Type))
}
}
}Java
次の Java SDK コードでテーブルバケットを一覧表示します。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class ListTableBucketsSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
int maxBuckets = 10;
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
ListTableBucketsRequest request = ListTableBucketsRequest.newBuilder()
.maxBuckets(maxBuckets)
.build();
ListTableBucketsResult result = client.listTableBuckets(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Continuation token: %s%n", result.continuationToken());
System.out.printf("Number of buckets: %d%n", result.tableBuckets().size());
for (int i = 0; i < result.tableBuckets().size(); i++) {
TableBucketSummary bucket = result.tableBuckets().get(i);
System.out.printf("Bucket %d:%n", i + 1);
System.out.printf(" ARN: %s%n", bucket.arn());
System.out.printf(" Name: %s%n", bucket.name());
System.out.printf(" ID: %s%n", bucket.tableBucketId());
System.out.printf(" Owner Account ID: %s%n", bucket.ownerAccountId());
System.out.printf(" Created At: %s%n", bucket.createdAt());
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
ListTableBuckets API を呼び出してテーブルバケットを一覧表示します。
テーブルバケットの削除
テーブルバケットを削除するには、まずテーブルバケット内のすべてのテーブルと名前空間を削除する必要があります。空でないテーブルバケットは削除できません。この操作は元に戻すことはできません。操作は慎重に行ってください。
コンソール
OSS コンソールにログインします。左側メニューで、[テーブルバケット一覧] を選択します。
テーブルバケットの [操作] 列にある [削除] をクリックします。
確認のダイアログボックスで、[OK] をクリックします。
ossutil
次の ossutil コマンドでテーブルバケットを削除します。
ossutil tables-api delete-table-bucket --table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucketSDK
Python
次の Python SDK コードでテーブルバケットを削除します。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="delete table bucket sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.delete_table_bucket(oss_tables.models.DeleteTableBucketRequest(
table_bucket_arn=args.table_bucket_arn,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
if __name__ == "__main__":
main()Go
次の Go SDK コードでテーブルバケットを削除します。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.DeleteTableBucket(context.TODO(), &tables.DeleteTableBucketRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
})
if err != nil {
log.Fatalf("failed to delete table bucket %v", err)
}
log.Printf("delete table bucket result:%#v\n", result)
}Java
次の Java SDK コードでテーブルバケットを削除します。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class DeleteTableBucketSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
DeleteTableBucketRequest request = DeleteTableBucketRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.build();
DeleteTableBucketResult result = client.deleteTableBucket(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.println("Successfully deleted table bucket.");
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
DeleteTableBucket API を呼び出してテーブルバケットを削除します。
名前空間
名前空間は、リレーショナルデータベースのスキーマと同様に、テーブルバケット内のテーブルを論理的にグループ化し、分離します。テーブルバケットごとに最大 10,000 個の名前空間を作成できます。
OSS コンソールでは、テーブル作成ワークフローの一部として名前空間を管理します。テーブルを作成するには、[名前空間] ドロップダウンメニューから既存の名前空間を選択するか、[名前空間の作成] をクリックして名前を入力することで新しい名前空間を作成できます。また、ossutil、SDK、または API を使用して、名前空間を個別に管理することもできます。
名前空間の命名規則:
長さは 1~255 文字であること。
小文字、数字、アンダースコア (_) のみを含むこと。
アンダースコアで開始または終了しないこと。
テーブルバケット内で一意であること。
名前空間の作成
ossutil
ossutil tables-api create-namespace \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespaceSDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="名前空間作成のサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='作成する名前空間。複数ある場合はカンマ区切り。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
namespaces = args.namespace.split(",")
result = client.create_namespace(oss_tables.models.CreateNamespaceRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=namespaces,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'テーブルバケットに名前空間を正常に作成しました: {args.table_bucket_arn}')
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。リージョンが必要です")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.CreateNamespace(context.TODO(), &tables.CreateNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: []string{"my_space"},
})
if err != nil {
log.Fatalf("名前空間の作成に失敗しました %v", err)
}
log.Printf("create namespace result:%#v\n", result)
}Java
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
import java.util.Arrays;
import java.util.List;
public class CreateNamespaceSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
List<String> namespaces = Arrays.asList("mynamespace");
CreateNamespaceRequest request = CreateNamespaceRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespaces)
.build();
CreateNamespaceResult result = client.createNamespace(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブルバケットに名前空間を正常に作成しました: %s%n", tableBucketARN);
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
CreateNamespace API を使用して名前空間を作成します。
名前空間の取得
ossutil
ossutil tables-api get-namespace \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespaceSDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="名前空間取得のサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='取得する名前空間。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_namespace(oss_tables.models.GetNamespaceRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' namespace: {result.namespace},'
f' namespace id: {result.namespace_id},'
f' table bucket id: {result.table_bucket_id},'
f' owner account id: {result.owner_account_id},'
f' created at: {result.created_at},'
f' created by: {result.created_by}')
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。リージョンが必要です")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetNamespace(context.TODO(), &tables.GetNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr("my_space"),
})
if err != nil {
log.Fatalf("名前空間の取得に失敗しました %v", err)
}
log.Printf("get namespace result:%#v\n", result)
}Java
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetNamespaceSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetNamespaceRequest request = GetNamespaceRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.build();
GetNamespaceResult result = client.getNamespace(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブルバケット %2$s から名前空間 %1$s を正常に取得しました%n", result.namespaceId(), tableBucketARN);
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
GetNamespace API を使用して、名前空間の詳細を取得します。
名前空間の一覧表示
ossutil
ossutil tables-api list-namespaces \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucketSDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="名前空間一覧表示のサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--prefix', help='名前空間をフィルタリングするためのプレフィックス。')
parser.add_argument('--max-namespaces', type=int, help='返す名前空間の最大数。')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.list_namespaces(oss_tables.models.ListNamespacesRequest(
table_bucket_arn=args.table_bucket_arn,
prefix=args.prefix,
max_namespaces=args.max_namespaces,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' continuation token: {result.continuation_token}')
if result.namespaces:
for i, ns in enumerate(result.namespaces):
print(f'namespace {i + 1}:'
f' namespace: {ns.namespace},'
f' namespace id: {ns.namespace_id},'
f' owner account id: {ns.owner_account_id},'
f' created at: {ns.created_at},'
f' created by: {ns.created_by}')
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。リージョンが必要です")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
p := client.NewListNameSpacesPaginator(&tables.ListNamespacesRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
})
var i int
log.Println("名前空間:")
for p.HasNext() {
i++
page, err := p.NextPage(context.TODO())
if err != nil {
log.Fatalf("ページ %v の取得に失敗しました, %v", i, err)
}
for _, b := range page.Namespaces {
log.Printf("Namespace %v,%v,%v,%v,%v,%v\n", oss.ToString(b.CreatedAt), oss.ToString(b.CreatedBy), oss.ToString(b.OwnerAccountId), oss.ToString(b.TableBucketId), oss.ToString(b.NamespaceId), b.Namespace)
}
}
}Java
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class ListNamespacesSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
int maxNamespaces = 10;
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
ListNamespacesRequest request = ListNamespacesRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.maxNamespaces(maxNamespaces)
.build();
ListNamespacesResult result = client.listNamespaces(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブルバケット %s の名前空間を正常に一覧表示しました%n", tableBucketARN);
System.out.printf("継続トークン: %s%n", result.continuationToken());
for (int i = 0; i < result.namespaces().size(); i++) {
NamespaceSummary ns = result.namespaces().get(i);
if (ns.namespace() != null && !ns.namespace().isEmpty()) {
System.out.printf("名前空間 %d: %s (ID: %s)%n", i + 1, ns.namespace().get(0), ns.namespaceId());
} else {
System.out.printf("名前空間 %d: (名前空間名なし) (ID: %s)%n", i + 1, ns.namespaceId());
}
}
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
ListNamespaces API を使用して名前空間を一覧表示します。
名前空間の削除
名前空間を削除する前に、その名前空間内のすべてのテーブルを削除する必要があります。
ossutil
ossutil tables-api delete-namespace \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespaceSDK
Python
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="名前空間削除のサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='削除する名前空間。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.delete_namespace(oss_tables.models.DeleteNamespaceRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'名前空間を正常に削除しました: {args.namespace}')
if __name__ == "__main__":
main()Go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。リージョンが必要です")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.DeleteNamespace(context.TODO(), &tables.DeleteNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr("my_space"),
})
if err != nil {
log.Fatalf("名前空間の削除に失敗しました %v", err)
}
log.Printf("delete namespace result:%#v\n", result)
}Java
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class DeleteNamespaceSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
DeleteNamespaceRequest request = DeleteNamespaceRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.build();
DeleteNamespaceResult result = client.deleteNamespace(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブルバケット %2$s から名前空間 %1$s を正常に削除しました%n", namespace, tableBucketARN);
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
DeleteNamespace API を使用して名前空間を削除します。
テーブル
テーブルは、Apache Iceberg フォーマットで格納されたデータセットです。
テーブルの作成
対象の名前空間が存在しない場合は、まず名前空間を作成してください。各テーブルバケットには、最大 10,000 個の名前空間と 10,000 個のテーブルを格納できます。
スキーマ
現在、コンソールは Iceberg のネストされた型 (struct、list、map など) をサポートしていません。ネストされた型を含むテーブルを管理するには、API を使用する必要があります。
テーブルを作成する際、スキーマを使用してそのフィールド構造を定義します。各フィールドには、name、type、必須であるかどうかの required といった属性があります。
以下の表は、サポートされているフィールド型を示しています。
型 | 説明 |
boolean |
|
int | 32 ビット符号付き整数。 |
long | 64 ビット符号付き整数。 |
float | 32 ビット IEEE 754 浮動小数点数。 |
double | 64 ビット IEEE 754 浮動小数点数。 |
decimal(P, S) | 固定精度の10進数。P は精度、S はスケールです。 |
date | 時刻やタイムゾーンを含まない日付。 |
timestamp | マイクロ秒精度のタイムスタンプ。タイムゾーン情報を含みません。 |
timestamptz | マイクロ秒精度のタイムスタンプ。タイムゾーン情報を含みます。 |
string | UTF-8 でエンコードされた文字列。 |
binary | 可変長のバイト配列。 |
uuid | 汎用一意識別子 (UUID)。 |
以下は、スキーマ定義の例です。
{
"schema": {
"fields": [
{"name": "id", "type": "long", "required": true},
{"name": "name", "type": "string", "required": true},
{"name": "created_at", "type": "timestamptz", "required": false}
]
}
}パーティション仕様
パーティション仕様 (Partition Spec) は、テーブル内のデータをどのようにパーティション分割するかを定義します。適切に設計されたパーティション仕様は、スキャンするデータ量を削減することで、クエリのパフォーマンスを大幅に向上させます。
以下のパーティション変換タイプがサポートされています。
変換タイプ | 説明 | 対象の型 |
identity | 変換を行わず、列の元の値でパーティション分割します。 | すべての型。 |
year | 日付またはタイムスタンプから抽出された年でパーティション分割します。 | date、timestamp、timestamptz。 |
month | 日付またはタイムスタンプから抽出された月でパーティション分割します。 | date、timestamp、timestamptz。 |
day | 日付またはタイムスタンプから抽出された日でパーティション分割します。 | date、timestamp、timestamptz。 |
hour | タイムスタンプから抽出された時間でパーティション分割します。 | timestamp、timestamptz。 |
bucket[N] | 列の値をハッシュ化して N 個のバケットに分割することでパーティション分割します。高カーディナリティ フィールドを均等に分散するのに適しています。 | int、long、string、decimal、date、timestamp、timestamptz、uuid。 |
truncate[N] |
| int、long、string、decimal。 |
コンソール
OSS コンソールでテーブルを作成するには、以下の手順に従ってください。
OSS コンソールにログインします。左側のメニューで、[テーブルバケット一覧] を選択します。
対象のテーブルバケットの名前をクリックして、詳細ページを開きます。
[テーブル一覧] タブで [テーブルの作成] をクリックします。
[テーブルの作成] ダイアログボックスで、以下のパラメータを設定します。
[名前空間]: ドロップダウンメニューから既存の名前空間を選択するか、新しい名前を入力して作成します。名前は 1~255 文字で、テーブルバケット内で一意である必要があります。小文字、数字、アンダースコア (_) のみを使用できます。アンダースコアで開始または終了することはできません。
[テーブルフォーマット]: [Iceberg] を選択します。
[テーブル名]: テーブルの名前を入力します。名前は 1~255 文字で、名前空間内で一意である必要があります。小文字、数字、アンダースコア (_) のみを使用できます。アンダースコアで開始または終了することはできません。
[サーバー側の暗号化方式]: [なし] または [AES256] を選択します。
[テーブルフォーマットバージョン]: Iceberg テーブルフォーマットのバージョンを選択します。バージョン 2 と 3 がサポートされています。例: [2]。
[フィールド情報]: フィールドを追加します。各フィールドについて、[ID]、[列名]、[必須] ステータス、[データ型] を設定します。
パーティション情報: パーティションを追加し、各パーティションに
sourceId、[パーティションフィールド名]、およびtransformを設定します。ソート情報: ソート順を追加します。ソート順ごとに、
sourceId、transform、direction、およびnullOrderを設定します。
[OK] をクリックします。
ossutil
ossutil を使用してテーブルを作成する前に、ターゲットの名前空間が存在しない場合は、まず名前空間を作成する必要があります。次のコマンド例では、properties パラメーターに、Iceberg テーブルフォーマットバージョンを指定する format-version が含まれています。この値は 2 または 3 に設定できます。サーバー側の暗号化を設定するには、--encryption-configuration パラメーターを使用します。
# ステップ 2: テーブルを作成し、テーブルフォーマットのバージョンとサーバー側の暗号化方式を指定します
ossutil tables-api create-table \
--region cn-hangzhou \
--endpoint https://cn-hangzhou.oss-tables.aliyuncs.com \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespace \
--name mytable \
--format ICEBERG \
--metadata '{"iceberg":{"schema":{"fields":[{"name":"id","type":"long","required":true},{"name":"data","type":"string"}]},"properties":{"format-version":"2"}}}' \
--encryption-configuration '{"sseAlgorithm":"AES256"}'SDK
Python
以下のコードは、Python SDK を使用してテーブルを作成する方法を示しています。対象の名前空間が存在しない場合は、まず作成する必要があります。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="create table sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)
parser.add_argument('--format', help='テーブルのフォーマット。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
# スキーマフィールドを作成
schema = oss_tables.models.IcebergSchema(fields=[
oss_tables.models.SchemaField(name="id", type="long", required=True),
oss_tables.models.SchemaField(name="name", type="string", required=False),
oss_tables.models.SchemaField(name="ts", type="timestamptz", required=False),
])
# パーティション仕様を作成
partition_spec = oss_tables.models.IcebergPartitionSpec(
spec_id=0,
fields=[
oss_tables.models.IcebergPartitionField(
source_id=2,
field_id=1001,
name="region",
transform="identity",
),
],
)
# Iceberg メタデータを作成します。「properties」を使用して「format-version」を指定します。バージョン "2" と "3" がサポートされています。
iceberg_metadata = oss_tables.models.IcebergMetadata(
schema=schema,
partition_spec=partition_spec,
properties={"format-version": "2"},
)
# メタデータを設定
metadata = oss_tables.models.TableMetadata(iceberg=iceberg_metadata)
# 暗号化設定を追加します。「sse_algorithm」は "AES256" と "KMS" をサポートします。"KMS" を使用する場合、「kms_key_arn」も指定する必要があります。
encryption_configuration = oss_tables.models.EncryptionConfiguration(
sse_algorithm="AES256",
)
result = client.create_table(oss_tables.models.CreateTableRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
format=args.format,
metadata=metadata,
encryption_configuration=encryption_configuration,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' table arn: {result.table_arn},'
f' version token: {result.version_token}')
if __name__ == "__main__":
main()Go
以下のコードは、Go SDK を使用してテーブルを作成する方法を示しています。対象の名前空間が存在しない場合は、まず作成する必要があります。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
flag.StringVar(&name, "name", "", "テーブルの名前。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
// マップを使用して完全な Iceberg メタデータを構築します。properties の「format-version」は、テーブルフォーマットのバージョン ("2" または "3") を指定します。
icebergMap := map[string]any{
"schema": map[string]any{
"fields": []map[string]any{
{"name": "id", "type": "long", "required": true},
{"name": "data", "type": "string"},
},
},
"properties": map[string]any{
"format-version": "2",
},
}
result, err := client.CreateTable(context.TODO(), &tables.CreateTableRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
Format: oss.Ptr("ICEBERG"),
Metadata: &tables.TableMetadata{
Iceberg: &tables.IcebergMetadata{Schema: icebergMap},
},
// サーバー側の暗号化: SseAlgorithm
EncryptionConfiguration: &tables.EncryptionConfiguration{
SseAlgorithm: oss.Ptr("AES256"),
},
})
if err != nil {
log.Fatalf("failed to create table %v", err)
}
log.Printf("create table result:%#v\n", result)
}Java
以下のコードは、Java SDK を使用してテーブルを作成する方法を示しています。対象の名前空間が存在しない場合は、まず作成する必要があります。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class CreateTableSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
String name = "mytable";
String format = "ICEBERG";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
// スキーマフィールドを作成
List<SchemaField> fields = new ArrayList<>();
fields.add(SchemaField.newBuilder()
.name("id")
.type("long")
.required(true)
.build());
fields.add(SchemaField.newBuilder()
.name("name")
.type("string")
.required(false)
.build());
fields.add(SchemaField.newBuilder()
.name("ts")
.type("timestamptz")
.required(false)
.build());
// スキーマを作成
IcebergSchema icebergSchema = IcebergSchema.newBuilder()
.fields(fields)
.build();
// パーティション仕様を作成
IcebergPartitionField partitionField = IcebergPartitionField.newBuilder()
.sourceId(2)
.transform("identity")
.name("region")
.fieldId(1001)
.build();
List<IcebergPartitionField> partitionFields = new ArrayList<>();
partitionFields.add(partitionField);
IcebergPartitionSpec partitionSpec = IcebergPartitionSpec.newBuilder()
.specId(0)
.fields(partitionFields)
.build();
// Iceberg メタデータを作成します。「properties」を使用して「format-version」を指定します。バージョン "2" と "3" がサポートされています。
Map properties = new HashMap<>();
properties.put("format-version", "2");
IcebergMetadata icebergMetadata = IcebergMetadata.newBuilder()
.schema(icebergSchema)
.partitionSpec(partitionSpec)
.properties(properties)
.build();
// メタデータを設定
TableMetadata metadata = TableMetadata.newBuilder()
.iceberg(icebergMetadata)
.build();
// 暗号化設定を追加
EncryptionConfiguration encryptionConfig = EncryptionConfiguration.newBuilder()
.sseAlgorithm("AES256")
.build();
CreateTableRequest request = CreateTableRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.format(format)
.metadata(metadata)
.encryptionConfiguration(encryptionConfig)
.build();
CreateTableResult result = client.createTable(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Created table with ARN: %s%n", result.tableARN());
System.out.printf("Version token: %s%n", result.versionToken());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
CreateTable API を使用して、テーブルを作成します。
テーブルの取得
テーブルの詳細情報を取得します。取得される情報には、名前、名前空間、テーブル ARN、フォーマット、作成者、作成日時などが含まれます。
コンソール
OSS コンソールでテーブルの詳細を表示するには、次の手順に従います。
OSS コンソールにログインします。左側メニューで、[テーブルバケット一覧] を選択します。
ターゲットのテーブルバケットの名前をクリックして、詳細を表示します。
[テーブル一覧] タブで、ターゲットのテーブルの名前をクリックして、詳細を表示します。
ossutil
次の例は、ossutil コマンドを使用してテーブルの情報を取得する方法を示しています。
ossutil tables-api get-table \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespace \
--name mytableSDK
Python
次のコードは、Python SDK を使用してテーブルの情報を取得する方法の例を示しています。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。')
parser.add_argument('--namespace', help='テーブルの名前空間。')
parser.add_argument('--name', help='テーブルの名前。')
parser.add_argument('--table-arn', help='テーブルの ARN。')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table(oss_tables.models.GetTableRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
table_arn=args.table_arn,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' name: {result.name},'
f' table arn: {result.table_arn},'
f' format: {result.format},'
f' created by: {result.created_by},'
f' created at: {result.created_at}')
if __name__ == "__main__":
main()Go
次のコードは、Go SDK を使用してテーブルの情報を取得する方法の例を示しています。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
tableArn string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "テーブルの名前空間。")
flag.StringVar(&name, "name", "", "テーブルの名前。")
flag.StringVar(&tableArn, "table-arn", "", "テーブルの ARN。")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
// 方法 1:テーブルバケット ARN、名前空間、名前でクエリします。
result, err := client.GetTable(context.TODO(), &tables.GetTableRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
// 方法 2:テーブル ARN でクエリします。
//result, err := client.GetTable(context.TODO(), &tables.GetTableRequest{
// TableARN: oss.Ptr(tableArn),
//})
if err != nil {
log.Fatalf("failed to get table %v", err)
}
log.Printf("get table result:%#v\n", result)
}Java
次のコードは、Java SDK を使用してテーブルの情報を取得する方法の例を示しています。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
String tableName = "mytable";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
// 方法 1:テーブルバケット ARN、名前空間、名前でクエリします。
GetTableRequest request = GetTableRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(tableName)
.build();
// 方法 2:テーブル ARN でクエリします。
// GetTableRequest request = GetTableRequest.newBuilder()
// .tableARN("acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket/table/table-id")
// .build();
GetTableResult result = client.getTable(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Table name: %s%n", result.name());
System.out.printf("Table ARN: %s%n", result.tableARN());
System.out.printf("Format: %s%n", result.format());
System.out.printf("Created by: %s%n", result.createdBy());
System.out.printf("Created at: %s%n", result.createdAt());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
GetTable API を使用して、テーブルの詳細情報を取得します。
テーブルの一覧表示
この操作では、指定された名前空間内のすべてのテーブルを一覧表示し、ページネーションをサポートします。
コンソール
OSS コンソールでテーブルを一覧表示するには、次の手順に従ってください。
OSS コンソールにサインインします。左側メニューで、[テーブルバケット一覧] を選択します。
対象のテーブルバケットの名前をクリックして、その詳細ページを表示します。
[テーブル一覧] タブに、指定された名前空間内のテーブルが表示されます。
Ossutil
次の例では、ossutil を使用してテーブルを一覧表示します。
ossutil tables-api list-tables \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespaceSDK
Python
次の例では、Python SDK を使用してテーブルを一覧表示します。
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="テーブル一覧表示のサンプル")
parser.add_argument('--region', help='テーブルバケットのリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスから OSS Tables にアクセスするためのドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--prefix', help='テーブルの絞り込み用のプレフィックス。')
parser.add_argument('--max-tables', type=int, help='返されるテーブルの最大数。')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.list_tables(oss_tables.models.ListTablesRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
prefix=args.prefix,
max_tables=args.max_tables,
))
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' continuation token: {result.continuation_token}')
if result.table_summaries:
for i, table in enumerate(result.table_summaries):
print(f'table {i + 1}:'
f' name: {table.name},'
f' namespace: {table.namespace},'
f' type: {table.type},'
f' table arn: {table.table_arn},'
f' created at: {table.created_at},'
f' modified at: {table.modified_at}')
if __name__ == "__main__":
main()Go
次の例では、Go SDK を使用してテーブルを一覧表示します。
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットのリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "テーブルの名前空間。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
p := client.NewListTablesPaginator(&tables.ListTablesRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
})
var i int
log.Println("テーブル:")
for p.HasNext() {
i++
page, err := p.NextPage(context.TODO())
if err != nil {
log.Fatalf("ページ %v の取得に失敗しました、%v", i, err)
}
for _, b := range page.Tables {
log.Printf("テーブル %v,%v,%v,%v,%v,%v\n", oss.ToString(b.CreatedAt), oss.ToString(b.TableARN), oss.ToString(b.ModifiedAt), oss.ToString(b.Type), oss.ToString(b.Name), b.Namespace)
}
}
}Java
次の例では、Java SDK を使用してテーブルを一覧表示します。
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class ListTablesSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
int maxTables = 10;
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
ListTablesRequest request = ListTablesRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.maxTables(maxTables)
.build();
ListTablesResult result = client.listTables(request);
System.out.printf("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Continuation token: %s%n", result.continuationToken());
if (result.tables() != null) {
System.out.printf("Number of tables: %d%n", result.tables().size());
for (int i = 0; i < result.tables().size(); i++) {
TableSummary table = result.tables().get(i);
System.out.printf("Table %d:%n", i + 1);
System.out.printf(" Name: %s%n", table.name());
System.out.printf(" Namespace: %s%n", table.namespace());
System.out.printf(" ARN: %s%n", table.tableARN());
System.out.printf(" Type: %s%n", table.type());
System.out.printf(" Created at: %s%n", table.createdAt());
System.out.printf(" Modified at: %s%n", table.modifiedAt());
}
} else {
System.out.println("テーブルが見つかりませんでした。");
}
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
テーブルを一覧表示するには、ListTables API を呼び出します。
テーブルの名前変更と移動
RenameTable API を使用して、次の操作を実行します:
テーブルの名前の変更:同じ名前空間内で、テーブルの名前を変更します。
テーブルの移動:同じテーブルバケット内で、テーブルを別の名前空間に移動します。
このオペレーションは、同時実行オペレーションによるデータ競合を防ぐためのオプティミスティックロックとして、versionToken をサポートします。
ossutil
次のコマンドは、ossutil を使用してテーブルの名前を変更する方法を示しています:
ossutil tables-api rename-table \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespace \
--name mytable \
--new-namespace mynamespace \
--new-name mytable_renamedSDK
Python
次のコードは、Python SDK を使用してテーブルの名前を変更する方法を示しています:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="テーブル名変更のサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSSTables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの現在の名前。', required=True)
parser.add_argument('--new-namespace-name', help='テーブルの新しい名前空間名。')
parser.add_argument('--new-name', help='テーブルの新しい名前。')
parser.add_argument('--version-token', help='テーブルのバージョントークン。')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.rename_table(oss_tables.models.RenameTableRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
new_namespace_name=args.new_namespace_name,
new_name=args.new_name,
version_token=args.version_token,
))
print(f'ステータスコード: {result.status_code},'
f' リクエスト ID: {result.request_id}')
print(f'テーブル {args.namespace}/{args.name} の名前を {args.new_namespace_name or args.namespace}/{args.new_name or args.name} に正常に変更しました')
if __name__ == "__main__":
main()Go
次のコードは、Go SDK を使用してテーブルの名前を変更する方法を示しています:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
newName string
)
func init() {
flag.StringVar(®ion, "region", "", "テーブルバケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
flag.StringVar(&name, "name", "", "テーブルの名前。")
flag.StringVar(&newName, "new-name", "", "テーブルの新しい名前。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブルバケットの ARN が必要です")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。名前空間名が必要です")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブル名が必要です")
}
if len(newName) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。テーブルの新しい名前が必要です")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("無効なパラメーターです。リージョンが必要です")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.RenameTable(context.TODO(), &tables.RenameTableRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
NewName: oss.Ptr(newName),
})
if err != nil {
log.Fatalf("テーブルの名前変更に失敗しました: %v", err)
}
log.Printf("テーブル名変更の結果: %#v\n", result)
}Java
次のコードは、Java SDK を使用してテーブルの名前を変更する方法を示しています:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class RenameTableSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
String name = "mytable";
String newName = "mytable-renamed";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
RenameTableRequest request = RenameTableRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.newName(newName)
.build();
RenameTableResult result = client.renameTable(request);
System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブルの名前を %s/%s から %s/%s に正常に変更しました%n",
namespace, name, namespace, newName);
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
RenameTable API を使用して、テーブルの名前を変更または移動します。
テーブルの削除
この操作は、指定されたテーブルとその中のすべてのデータを完全に削除します。この操作は不可逆です。テーブルを削除する前に、データがバックアップされていることを確認してください。
コンソール
OSS コンソールでテーブルを削除するには、次の手順を実行します。
OSS コンソールにサインインします。左側メニューで、[テーブルバケット一覧] を選択します。
対象のテーブルバケットの名前をクリックして、詳細ページを開きます。
[テーブル一覧] タブで、対象のテーブルを見つけ、[操作] 列の [削除] をクリックします。
確認ダイアログボックスで、[OK] をクリックします。
ossutil
ossutil でテーブルを削除するには、次のコマンドを使用します。
ossutil tables-api delete-table \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespace \
--name mytableSDK
Python
次のコードは、Python SDK を使用してテーブルを削除する方法の例です。
# ステップ 1: テーブルを削除
# 完全なサンプル: delete_table.py
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="delete table sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブルの名前。', required=True)
parser.add_argument('--version-token', help='オプティミスティックロック用のバージョントークン。')
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.delete_table(oss_tables.models.DeleteTableRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
version_token=args.version_token,
))
print(f'ステータスコード: {result.status_code},'
f' リクエスト ID: {result.request_id}')
print(f'テーブル {args.namespace}/{args.name} を正常に削除しました')
if __name__ == "__main__":
main()
# ----------------------------------------------------------------
# ステップ 2: 名前空間を削除 (名前空間を削除するには、まずその中のすべてのテーブルを削除する必要があります。)
# 完全なサンプル: delete_namespace.py
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="delete namespace sample")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='他のサービスが OSS Tables にアクセスするために使用できるドメイン名。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='削除する名前空間。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.delete_namespace(oss_tables.models.DeleteNamespaceRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
))
print(f'ステータスコード: {result.status_code},'
f' リクエスト ID: {result.request_id}')
print(f'名前空間 {args.namespace} を正常に削除しました')
if __name__ == "__main__":
main()Go
次のコードは、Go SDK を使用してテーブルを削除する方法の例です。
// ステップ 1: テーブルを削除
// 完全なサンプル: delete_table.go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "名前空間の名前。")
flag.StringVar(&name, "name", "", "テーブルの名前。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.DeleteTable(context.TODO(), &tables.DeleteTableRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
if err != nil {
log.Fatalf("テーブルの削除に失敗しました: %v", err)
}
log.Printf("テーブル削除の結果: %#v\n", result)
}
// ----------------------------------------------------------------
// ステップ 2: 名前空間を削除 (名前空間を削除するには、まずその中のすべてのテーブルを削除する必要があります。)
// 完全なサンプル: delete_namespace.go
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "削除する名前空間。")
}
func main() {
flag.Parse()
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace required")
}
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.DeleteNamespace(context.TODO(), &tables.DeleteNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
})
if err != nil {
log.Fatalf("名前空間の削除に失敗しました: %v", err)
}
log.Printf("名前空間削除の結果: %#v\n", result)
}Java
次のコードは、Java SDK を使用してテーブルを削除する方法の例です。
// ステップ 1: テーブルを削除
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class DeleteTableSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
String tableName = "mytable";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
DeleteTableRequest request = DeleteTableRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(tableName)
.build();
DeleteTableResult result = client.deleteTable(request);
System.out.printf("ステータスコード: %d, リクエスト ID: %s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブル %s/%s をバケット %s から正常に削除しました%n",
namespace, tableName, tableBucketARN);
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}
// ----------------------------------------------------------------
// ステップ 2: 名前空間を削除 (名前空間を削除するには、まずその中のすべてのテーブルを削除する必要があります。)
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class DeleteNamespaceSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
DeleteNamespaceRequest request = DeleteNamespaceRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.build();
DeleteNamespaceResult result = client.deleteNamespace(request);
System.out.printf("ステータスコード: %d, リクエスト ID: %s%n",
result.statusCode(), result.requestId());
System.out.printf("名前空間 %s をバケット %s から正常に削除しました%n",
namespace, tableBucketARN);
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}
API
テーブルを削除するには、DeleteTable API を使用します。
メタデータ管理
テーブルの Iceberg メタデータファイルには、テーブルのスキーマ、スナップショット履歴、パーティションスペックなどの重要な情報が含まれています。メタデータ管理には、次の 2 つの主要なプロパティが含まれます:
metadataLocation:メタデータファイルのストレージパスです。Iceberg のコミットごとに、新しいメタデータファイルが生成されます。パスの形式は
oss://{tableId}--table-oss/metadata/00000-{uuid}.metadata.jsonです。versionToken:メタデータのバージョンを識別します。このトークンは、メタデータが更新されるたびに変更されます。UpdateTableMetadataLocation または RenameTable API を実行する際は、オプティミスティックロックを実装するために、現在のバージョン トークンを含める必要があります。
ossutil
メタデータロケーションの取得:
ossutil tables-api get-table-metadata-location --table-bucket-arn {ARN} --namespace {ns} --name {table}メタデータロケーションの更新:
ossutil tables-api update-table-metadata-location --table-bucket-arn {ARN} --namespace {ns} --name {table} --metadata-location {location} --version-token {token}SDK
Python
メタデータロケーションの取得:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="テーブルのメタデータロケーションを取得するサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブル名。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.get_table_metadata_location(
oss_tables.models.GetTableMetadataLocationRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' version token: {result.version_token},'
f' metadata location: {result.metadata_location},'
f' warehouse location: {result.warehouse_location}')
if __name__ == "__main__":
main()メタデータロケーションの更新:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="テーブルのメタデータロケーションを更新するサンプル")
parser.add_argument('--region', help='テーブルバケットが配置されているリージョン。', required=True)
parser.add_argument('--endpoint', help='OSS Tables にアクセスするためのエンドポイント。')
parser.add_argument('--table-bucket-arn', help='テーブルバケットの ARN。', required=True)
parser.add_argument('--namespace', help='テーブルの名前空間。', required=True)
parser.add_argument('--name', help='テーブル名。', required=True)
parser.add_argument('--version-token', help='バージョン トークン。', required=True)
parser.add_argument('--metadata-location', help='新しいメタデータロケーション。', required=True)
def main():
args = parser.parse_args()
credentials_provider = oss.credentials.EnvironmentVariableCredentialsProvider()
cfg = oss.config.load_default()
cfg.credentials_provider = credentials_provider
cfg.region = args.region
if args.endpoint is not None:
cfg.endpoint = args.endpoint
client = oss_tables.Client(cfg)
result = client.update_table_metadata_location(
oss_tables.models.UpdateTableMetadataLocationRequest(
table_bucket_arn=args.table_bucket_arn,
namespace=args.namespace,
name=args.name,
version_token=args.version_token,
metadata_location=args.metadata_location,
)
)
print(f'status code: {result.status_code},'
f' request id: {result.request_id},'
f' name: {result.name},'
f' version token: {result.version_token},'
f' metadata location: {result.metadata_location},'
f' table arn: {result.table_arn}')
if __name__ == "__main__":
main()Go
メタデータロケーションの取得:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "テーブルの名前空間。")
flag.StringVar(&name, "name", "", "テーブル名。")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.GetTableMetadataLocation(context.TODO(), &tables.GetTableMetadataLocationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
if err != nil {
log.Fatalf("テーブルのメタデータロケーションの取得に失敗しました %v", err)
}
log.Printf("テーブルのメタデータロケーション取得結果:%#v\n", result)
}メタデータロケーションの更新:
package main
import (
"context"
"flag"
"log"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials"
"github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/tables"
)
var (
region string
tableBucketArn string
namespace string
name string
metadataLocation string
versionToken string
)
func init() {
flag.StringVar(®ion, "region", "", "バケットが配置されているリージョン。")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "テーブルバケットの ARN。")
flag.StringVar(&namespace, "namespace", "", "テーブルの名前空間。")
flag.StringVar(&name, "name", "", "テーブル名。")
flag.StringVar(&metadataLocation, "metadata-location", "", "テーブルのメタデータロケーション。")
flag.StringVar(&versionToken, "version-token", "", "テーブルのバージョン トークン。")
}
func main() {
flag.Parse()
if len(region) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, region required")
}
if len(tableBucketArn) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table bucket arn required")
}
if len(namespace) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, namespace name required")
}
if len(name) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table name required")
}
if len(metadataLocation) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table metadata location required")
}
if len(versionToken) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table version token required")
}
cfg := oss.LoadDefaultConfig().
WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()).
WithRegion(region)
client := tables.NewTablesClient(cfg)
result, err := client.UpdateTableMetadataLocation(context.TODO(), &tables.UpdateTableMetadataLocationRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
MetadataLocation: oss.Ptr(metadataLocation),
VersionToken: oss.Ptr(versionToken),
})
if err != nil {
log.Fatalf("テーブルのメタデータロケーションの更新に失敗しました %v", err)
}
log.Printf("テーブルのメタデータロケーション更新結果:%#v\n", result)
}Java
メタデータロケーションの取得:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class GetTableMetadataLocationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
String name = "mytable";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
GetTableMetadataLocationRequest request = GetTableMetadataLocationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.build();
GetTableMetadataLocationResult result = client.getTableMetadataLocation(request);
System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
result.statusCode(), result.requestId());
System.out.printf("メタデータロケーション: %s%n", result.metadataLocation());
System.out.printf("バージョン トークン: %s%n", result.versionToken());
System.out.printf("ウェアハウスロケーション: %s%n", result.warehouseLocation());
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}メタデータロケーションの更新:
import com.aliyun.sdk.service.oss2.credentials.EnvironmentVariableCredentialsProvider;
import com.aliyun.sdk.service.oss2.tables.OSSTablesClient;
import com.aliyun.sdk.service.oss2.tables.models.*;
public class UpdateTableMetadataLocationSample {
public static void main(String[] args) throws Exception {
String region = "cn-hangzhou";
String tableBucketARN = "acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket";
String namespace = "mynamespace";
String name = "mytable";
String versionToken = "your-version-token";
String metadataLocation = "oss://warehouse/metadata/v1.metadata.json";
try (OSSTablesClient client = OSSTablesClient.newBuilder()
.credentialsProvider(new EnvironmentVariableCredentialsProvider())
.region(region)
.build()) {
UpdateTableMetadataLocationRequest request = UpdateTableMetadataLocationRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(name)
.versionToken(versionToken)
.metadataLocation(metadataLocation)
.build();
UpdateTableMetadataLocationResult result = client.updateTableMetadataLocation(request);
System.out.printf("ステータスコード: %d、リクエスト ID: %s%n",
result.statusCode(), result.requestId());
System.out.printf("テーブル %s のメタデータロケーションを正常に更新しました%n", name);
System.out.printf("新しいメタデータロケーション: %s%n", result.metadataLocation());
System.out.printf("新しいバージョン トークン: %s%n", result.versionToken());
} catch (Exception e) {
System.out.println("エラー: " + e.getMessage());
}
}
}API
GetTableMetadataLocation API を使用して、メタデータロケーションを取得します。
UpdateTableMetadataLocation API を使用して、メタデータロケーションを更新します。
クォータと制限
項目 | 説明 |
テーブルバケットあたりのテーブル数 | 最大 10,000。より高いクォータが必要な場合は、テクニカルサポートにお問い合わせください。 |
テーブルバケットあたりの名前空間数 | 最大 10,000。 |
テーブルバケット数 | 各アカウントは、各リージョンで最大 10 個のテーブルバケットを作成できます。 |
テーブルバケット名の長さ | 3 ~ 32 文字。 |
テーブル名の長さ | 1 ~ 255 文字。 |
テーブルバケット名の有効な文字 | 使用できるのは小文字、数字、ハイフン (-) のみで、先頭または末尾にハイフンは使用できません。 |
テーブルバケット名の禁止されているプレフィックス | oss、acs、aliyun、alibaba、aws で始めることはできません。 |
テーブル名の有効な文字 | 使用できるのは小文字、数字、アンダースコア (_) のみで、先頭または末尾にアンダースコアは使用できません。 |
名前空間名の長さ | 1 ~ 255 文字。 |
名前空間名の有効な文字 | 使用できるのは小文字、数字、アンダースコア (_) のみで、先頭または末尾にアンダースコアは使用できません。 |
暗号化アルゴリズム | AES256 のみがサポートされています。 |
テーブルフォーマット | Iceberg のみがサポートされています。 |
課金
OSS Tables は、招待制テスト期間中は無料でご利用いただけます。商用リリースに関するお知らせは、公式サイトをご確認ください。