OSS Tables adalah layanan penyimpanan data lake terstruktur dari Alibaba Cloud OSS yang dibangun di atas format tabel terbuka Apache Iceberg. Layanan ini menawarkan penyimpanan berkinerja tinggi dan hemat biaya untuk data pelatihan AI serta analitik OLAP. Fitur pemeliharaan otomatis bawaannya—termasuk kompaksi, manajemen snapshot, dan pembersihan file yang tidak terhubung—menyediakan pengalaman data lake tanpa server yang bebas perawatan.
Minta akses
OSS Tables saat ini dalam masa pratinjau gratis berbasis undangan di wilayah China (Hangzhou), China (Shanghai), China (Ulanqab), China (Beijing), China (Shenzhen), Singapura, dan Jerman (Frankfurt). Pratinjau ini hanya tersedia bagi pelanggan yang telah menyelesaikan pendaftaran nama asli tingkat perusahaan. Untuk meminta akses, masuk ke Akun Alibaba Cloud Anda dan buka halaman Daftar Table Bucket. Pantau notifikasi penagihan selama masa pratinjau untuk menghindari biaya tak terduga.
Cara kerja
OSS Tables mengorganisasi data menggunakan struktur tiga tingkat (Table Bucket – Namespace – Tabel), menyediakan kemampuan manajemen hierarkis mulai dari isolasi resource hingga manajemen tabel.
Table Bucket: Kontainer resource tingkat atas dan unit sumber daya cloud yang digunakan untuk mengelola serta mengisolasi resource tabel. Jenisnya adalah customer dan digunakan untuk menampung tabel data terstruktur yang dibuat pengguna. Table Bucket memiliki ARN (Alibaba Cloud Resource Name) sendiri dalam format
acs:osstables:{region}:{uid}:bucket/{bucket-name}.Namespace: Lapisan isolasi logis, mirip dengan skema dalam database relasional. Namespace mengelompokkan tabel dari domain bisnis berbeda dan mengisolasi izin dalam satu Table Bucket.
Tabel: Tabel data aktual yang disimpan dalam format Apache Iceberg. Setiap tabel memiliki ARN unik dalam format
acs:osstables:{region}:{uid}:bucket/{bucket-name}/table/{table-id}dan mendukung kontrol izin detail halus. Anda harus menentukan skema saat membuat tabel. Jenis bidang yang didukung meliputi long, string, timestamptz, boolean, int, float, double, decimal(P,S), date, time, timestamp, uuid, binary, dan fixed[L].
Table bucket
Table Bucket adalah kontainer resource tingkat atas dalam OSS Tables yang menyimpan dan mengelola tabel dalam format Apache Iceberg.
Membuat bucket tabel
Anda dapat membuat maksimal 10 Table Bucket per Akun Alibaba Cloud dalam satu wilayah. Nama Table Bucket harus unik dalam wilayah yang sama.
Konsol
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Klik Create Table Bucket.
Pada kotak dialog Create Table Bucket, konfigurasikan parameter berikut:
Name: Masukkan nama untuk Table Bucket. Nama harus terdiri dari 3 hingga 32 karakter, hanya berisi huruf kecil, angka, dan tanda hubung (-), serta tidak boleh diawali atau diakhiri dengan tanda hubung. Nama juga tidak boleh diawali dengan awalan
oss,acs,aliyun,alibaba, atauaws.Region: Pilih wilayah, misalnya China (Beijing).
Data Directory Format: Nilai default-nya adalah
iceberg.Endpoint: Dihasilkan secara otomatis berdasarkan wilayah yang dipilih.
Redundancy Type: Nilai saat ini adalah local redundancy.
Server-Side Encryption: Pilih None atau AES256.
Klik OK.
ossutil
Perintah ossutil berikut membuat Table Bucket:
ossutil tables-api create-table-bucket --name mytablebucketSDK
Python
Kode SDK Python berikut membuat Table Bucket:
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='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--name', help='The name of the table bucket.', required=True)
parser.add_argument('--sse-algorithm', help='The server-side encryption algorithm.')
parser.add_argument('--kms-key-arn', help='The KMS key ARN for encryption.')
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
Kode SDK Go berikut membuat Table Bucket:
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", "", "The region in which the bucket is located.")
flag.StringVar(&name, "name", "", "The name of the bucket.")
}
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
Kode SDK Java berikut membuat Table Bucket:
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
Panggil operasi CreateTableBucket untuk membuat Table Bucket.
Setelah Table Bucket dibuat, konfigurasi pemeliharaan data otomatis (icebergUnreferencedFileRemoval) diaktifkan secara default untuk secara otomatis menghapus file yang tidak direferensikan dalam tabel Iceberg. Parameter default-nya adalah unreferencedDays=3 (menghapus file yang tidak direferensikan lebih dari 3 hari) dan nonCurrentDays=10 (menyimpan versi file non-current selama 10 hari).
Kueri table bucket
Konsol
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Klik nama Table Bucket untuk melihat detailnya.
Di halaman detail, lihat informasi dasar berikut:
Bucket Owner Account ID: ID Akun Alibaba Cloud yang memiliki Table Bucket.
Resource Identifier (ARN): ARN Table Bucket yang unik secara global.
Bucket Type: Menampilkan Customer, yang menunjukkan bahwa Table Bucket dibuat oleh pengguna.
Creation Time: Waktu pembuatan Table Bucket.
Storage Class: Menampilkan Standard - local redundancy.
Server-Side Encryption: Menampilkan konfigurasi enkripsi saat ini.
ossutil
Perintah ossutil berikut mengkueri Table Bucket:
ossutil tables-api get-table-bucket --table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucketSDK
Python
Kode SDK Python berikut mengkueri Table Bucket:
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='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', 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
Kode SDK Go berikut mengkueri Table Bucket:
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", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
}
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
Kode SDK Java berikut mengkueri Table Bucket:
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
Panggil operasi GetTableBucket untuk mengkueri Table Bucket.
Daftar table buckets
Konsol
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Di halaman daftar, lihat informasi seperti nama, wilayah, dan waktu pembuatan semua Table Bucket dalam akun Anda.
ossutil
Perintah ossutil berikut mencantumkan Table Buckets:
ossutil tables-api list-table-bucketsSDK
Python
Kode SDK Python berikut mencantumkan Table Buckets:
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='The region in which the table buckets are located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--prefix', help='The prefix used to filter the table buckets.')
parser.add_argument('--max-buckets', help='The maximum number of buckets to return.', 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
Kode SDK Go berikut mencantumkan Table Buckets:
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", "", "The region in which the bucket is located.")
}
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)
}
// Log the objects found
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
Kode SDK Java berikut mencantumkan Table Buckets:
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
Panggil operasi ListTableBuckets untuk mencantumkan Table Buckets.
Hapus bucket tabel
Untuk menghapus Table Bucket, Anda harus terlebih dahulu menghapus semua tabel dan namespace di dalamnya. Anda tidak dapat menghapus Table Bucket yang tidak kosong. Operasi ini tidak dapat dikembalikan. Lakukan dengan hati-hati.
Konsol
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Di kolom Actions untuk Table Bucket tersebut, klik Delete.
Di kotak dialog konfirmasi, klik OK.
ossutil
Perintah ossutil berikut menghapus Table Bucket:
ossutil tables-api delete-table-bucket --table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucketSDK
Python
Kode SDK Python berikut menghapus Table Bucket:
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='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', 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
Kode SDK Go berikut menghapus Table Bucket:
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", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
}
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
Kode SDK Java berikut menghapus Table Bucket:
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
Panggil operasi DeleteTableBucket untuk menghapus Table Bucket.
Namespace
Namespace mengelompokkan dan mengisolasi tabel secara logis dalam sebuah table bucket, mirip dengan skema dalam database relasional. Anda dapat membuat hingga 10.000 namespace per table bucket.
Di Konsol OSS, Anda mengelola namespace sebagai bagian dari alur kerja pembuatan tabel. Untuk membuat tabel, Anda dapat memilih namespace yang sudah ada dari menu drop-down Namespace atau membuat yang baru dengan mengklik Create Namespace dan memasukkan nama. Anda juga dapat mengelola namespace secara independen dengan ossutil, SDK, atau API.
Aturan penamaan namespace:
Panjangnya harus 1 hingga 255 karakter.
Hanya boleh berisi huruf kecil, angka, dan garis bawah (_).
Tidak boleh diawali atau diakhiri dengan garis bawah.
Harus unik dalam satu table bucket.
Buat namespace
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="create namespace sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace to create, comma separated if multiple.', 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'successfully created namespace(s) in table bucket: {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", "", "The region where the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
}
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.CreateNamespace(context.TODO(), &tables.CreateNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: []string{"my_space"},
})
if err != nil {
log.Fatalf("failed to create namespace %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("Successfully created namespace(s) in table bucket: %s%n", tableBucketARN);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan operasi API CreateNamespace untuk membuat namespace.
Dapatkan namespace
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="get namespace sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace to get.', 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", "", "The region where the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
}
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.GetNamespace(context.TODO(), &tables.GetNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr("my_space"),
})
if err != nil {
log.Fatalf("failed to get namespace %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("Successfully retrieved namespace: %s from table bucket: %s%n", result.namespaceId(), tableBucketARN);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan operasi API GetNamespace untuk mendapatkan detail namespace.
Daftar namespaces
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="list namespaces sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--prefix', help='The prefix to filter namespaces.')
parser.add_argument('--max-namespaces', type=int, help='The maximum number of namespaces to return.')
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", "", "The region where the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
}
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)
p := client.NewListNameSpacesPaginator(&tables.ListNamespacesRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
})
var i int
log.Println("Namespaces:")
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.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("Successfully listed namespaces for table bucket: %s%n", tableBucketARN);
System.out.printf("Continuation token: %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("Namespace %%d: %%s (ID: %%s)%%n", i+1, ns.namespace().get(0), ns.namespaceId());
} else {
System.out.printf("Namespace %%d: (no namespace name) (ID: %%s)%%n", i+1, ns.namespaceId());
}
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan operasi API ListNamespaces untuk mencantumkan namespaces.
Hapus namespace
Anda harus menghapus semua tabel dalam namespace sebelum dapat menghapus namespace tersebut.
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="delete namespace sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace to delete.', 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'successfully deleted namespace: {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", "", "The region where the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
}
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.DeleteNamespace(context.TODO(), &tables.DeleteNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr("my_space"),
})
if err != nil {
log.Fatalf("failed to delete namespace %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("Successfully deleted namespace: %s from table bucket: %s%n", namespace, tableBucketARN);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan operasi API DeleteNamespace untuk menghapus namespace.
Tabel
Tabel adalah set data yang disimpan dalam format Apache Iceberg.
Buat tabel
Jika namespace target belum ada, buat terlebih dahulu. Setiap Table Bucket dapat berisi hingga 10.000 namespace dan 10.000 tabel.
Skema
Saat ini, konsol tidak mendukung tipe bersarang Iceberg, seperti struct, list, dan map. Anda harus menggunakan API untuk mengelola tabel yang berisi tipe bersarang.
Saat membuat tabel, Anda menentukan struktur bidangnya menggunakan skema. Setiap bidang memiliki atribut seperti name, type, dan apakah bersifat required.
Tabel berikut menjelaskan jenis bidang yang didukung.
Type | Description |
boolean | Nilai |
int | Bilangan bulat bertanda 32-bit. |
long | Bilangan bulat bertanda 64-bit. |
float | Bilangan titik mengambang IEEE 754 32-bit. |
double | Bilangan titik mengambang IEEE 754 64-bit. |
decimal(P,S) | Desimal presisi tetap, di mana P adalah presisi dan S adalah skala. |
date | Tanggal tanpa waktu atau zona waktu. |
timestamp | Timestamp dengan presisi mikrodetik, tanpa informasi zona waktu. |
timestamptz | Timestamp dengan presisi mikrodetik, dengan informasi zona waktu. |
string | String yang dikodekan UTF-8. |
binary | Array byte dengan panjang variabel. |
uuid | Identifier Unik Universal (UUID). |
Berikut contoh definisi skema:
{
"schema": {
"fields": [
{"name": "id", "type": "long", "required": true},
{"name": "name", "type": "string", "required": true},
{"name": "created_at", "type": "timestamptz", "required": false}
]
}
}Spesifikasi partisi
Spesifikasi partisi (Partition Spec) menentukan cara data dalam tabel dipartisi. Spesifikasi partisi yang dirancang dengan baik dapat meningkatkan kinerja kueri secara signifikan dengan mengurangi jumlah data yang dipindai.
Jenis transformasi partisi berikut didukung:
Transform type | Description | Applicable types |
identity | Partisi berdasarkan nilai mentah kolom tanpa transformasi. | Semua jenis. |
year | Partisi berdasarkan tahun yang diekstraksi dari tanggal atau timestamp. | date, timestamp, timestamptz. |
month | Partisi berdasarkan bulan yang diekstraksi dari tanggal atau timestamp. | date, timestamp, timestamptz. |
day | Partisi berdasarkan hari yang diekstraksi dari tanggal atau timestamp. | date, timestamp, timestamptz. |
hour | Partisi berdasarkan jam yang diekstraksi dari timestamp. | timestamp, timestamptz. |
bucket[N] | Partisi dengan meng-hash nilai kolom ke dalam N bucket. Cocok untuk mendistribusikan merata bidang dengan kardinalitas tinggi. | int, long, string, decimal, date, timestamp, timestamptz, uuid. |
truncate[N] | Partisi dengan memotong nilai | int, long, string, decimal. |
Konsol
Untuk membuat tabel di Konsol OSS, ikuti langkah-langkah berikut:
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Klik nama Table Bucket target untuk membuka halaman detailnya.
Di tab Daftar Tabel, klik Create Table.
Pada kotak dialog Create Table, konfigurasikan parameter berikut:
Namespace: Pilih namespace yang sudah ada dari menu drop-down, atau masukkan nama baru untuk membuatnya. Nama harus terdiri dari 1 hingga 255 karakter dan unik dalam Table Bucket. Nama hanya boleh berisi huruf kecil, angka, dan garis bawah (_), serta tidak boleh diawali atau diakhiri dengan garis bawah.
Table Format: Pilih Iceberg.
Table Name: Masukkan nama untuk tabel. Nama harus terdiri dari 1 hingga 255 karakter dan unik dalam namespace. Nama hanya boleh berisi huruf kecil, angka, dan garis bawah (_), serta tidak boleh diawali atau diakhiri dengan garis bawah.
Server-side Encryption Method: Pilih None atau AES256.
Table Format Version: Pilih versi format tabel Iceberg, misalnya 2.
Field Information: Tambahkan bidang. Untuk setiap bidang, konfigurasikan ID, Column Name, status Required, dan Data Type.
Partition Information: Tambahkan partisi. Untuk setiap partisi, konfigurasikan
sourceId, Partition Field Name, dantransform.Sort Information: Tambahkan urutan pengurutan. Untuk setiap urutan pengurutan, konfigurasikan
sourceId,transform,direction, dannullOrder.
Klik OK.
ossutil
Sebelum menggunakan ossutil untuk membuat tabel, Anda harus terlebih dahulu membuat namespace jika namespace target belum ada. Berikut contoh perintah untuk membuat tabel. Dalam perintah ini, parameter properties berisi format-version, yang menentukan versi format tabel Iceberg dan dapat diatur ke 2 atau 3. Gunakan parameter --encryption-configuration untuk mengonfigurasi enkripsi sisi server.
# Step 2: Create a table, specifying the table format version and server-side encryption method
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
Kode berikut menunjukkan cara membuat tabel menggunakan SDK Python. Jika namespace target belum ada, Anda harus membuatnya terlebih dahulu.
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='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
parser.add_argument('--format', help='The format of the table.', 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)
# Create schema fields
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),
])
# Create partition spec
partition_spec = oss_tables.models.IcebergPartitionSpec(
spec_id=0,
fields=[
oss_tables.models.IcebergPartitionField(
source_id=2,
field_id=1001,
name="region",
transform="identity",
),
],
)
# Create Iceberg metadata. Use 'properties' to specify 'format-version', which supports "2" and "3".
iceberg_metadata = oss_tables.models.IcebergMetadata(
schema=schema,
partition_spec=partition_spec,
properties={"format-version": "2"},
)
# Set metadata
metadata = oss_tables.models.TableMetadata(iceberg=iceberg_metadata)
# Add encryption configuration. 'sse_algorithm' supports "AES256" and "KMS". If using "KMS", 'kms_key_arn' must also be specified.
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
Kode berikut menunjukkan cara membuat tabel menggunakan SDK Go. Jika namespace target belum ada, Anda harus membuatnya terlebih dahulu.
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", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The arn of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
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)
// Build the complete Iceberg metadata using a map. 'format-version' in properties specifies the table format version ("2" or "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},
},
// Server-side encryption: 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
Kode berikut menunjukkan cara membuat tabel menggunakan SDK Java. Jika namespace target belum ada, Anda harus membuatnya terlebih dahulu.
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.List;
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()) {
// Create schema fields
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());
// Create schema
IcebergSchema icebergSchema = IcebergSchema.newBuilder()
.fields(fields)
.build();
// Create partition spec
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();
// Create iceberg metadata
IcebergMetadata icebergMetadata = IcebergMetadata.newBuilder()
.schema(icebergSchema)
.partitionSpec(partitionSpec)
.build();
// Set metadata
TableMetadata metadata = TableMetadata.newBuilder()
.iceberg(icebergMetadata)
.build();
// Add encryption configuration
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
Gunakan operasi API CreateTable untuk membuat tabel.
Dapatkan Tabel
Mengambil informasi detail untuk Tabel, termasuk nama, namespace, ARN Tabel, format, versionToken, metadataLocation, dan warehouseLocation.
Konsol
Ikuti langkah-langkah berikut untuk melihat detail Tabel di Konsol OSS:
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Klik nama Table Bucket target untuk melihat detailnya.
Di tab Daftar Tabel, klik nama Tabel target untuk melihat detailnya.
ossutil
Contoh berikut menunjukkan cara menggunakan perintah ossutil untuk mengambil informasi Tabel:
ossutil tables-api get-table \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespace \
--name mytableSDK
Python
Kode berikut memberikan contoh cara menggunakan SDK Python untuk mengambil informasi Tabel:
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='The region where the Table Bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the Table Bucket.')
parser.add_argument('--namespace', help='The namespace of the Table.')
parser.add_argument('--name', help='The name of the Table.')
parser.add_argument('--table-arn', help='The ARN of the Table.')
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
Kode berikut memberikan contoh cara menggunakan SDK Go untuk mengambil informasi Tabel:
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", "", "The region where the Table Bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the Table Bucket.")
flag.StringVar(&namespace, "namespace", "", "The namespace of the Table.")
flag.StringVar(&name, "name", "", "The name of the Table.")
flag.StringVar(&tableArn, "table-arn", "", "The ARN of the Table.")
}
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)
// Method 1: Query by using the Table Bucket ARN, namespace, and name.
result, err := client.GetTable(context.TODO(), &tables.GetTableRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr(namespace),
Name: oss.Ptr(name),
})
// Method 2: Query by using the Table 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
Kode berikut memberikan contoh cara menggunakan SDK Java untuk mengambil informasi Tabel:
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()) {
// Method 1: Query by using the Table Bucket ARN, namespace, and name.
GetTableRequest request = GetTableRequest.newBuilder()
.tableBucketARN(tableBucketARN)
.namespace(namespace)
.name(tableName)
.build();
// Method 2: Query by using the Table 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
Gunakan operasi API GetTable untuk mengambil informasi detail Tabel.
Daftar tabel
Operasi ini mencantumkan semua tabel dalam namespace tertentu dan mendukung paginasi.
Konsol
Ikuti langkah-langkah berikut untuk mencantumkan tabel di Konsol OSS:
Masuk ke Konsol OSS. Di panel navigasi sebelah kiri, pilih Table bucket list.
Klik nama table bucket target untuk melihat halaman detailnya.
Pada tab Table list, Anda dapat melihat semua tabel di seluruh namespace dalam bucket tabel saat ini.
Ossutil
Contoh berikut menunjukkan cara mencantumkan tabel menggunakan ossutil:
ossutil tables-api list-tables \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespaceSDK
Python
Contoh berikut menunjukkan cara mencantumkan tabel menggunakan SDK Python:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="list tables sample")
parser.add_argument('--region', help='The region of the table bucket.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the tables.', required=True)
parser.add_argument('--prefix', help='The prefix to filter tables.')
parser.add_argument('--max-tables', type=int, help='The maximum number of tables to return.')
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
Contoh berikut menunjukkan cara mencantumkan tabel menggunakan SDK 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", "", "The region of the table bucket.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The namespace of the tables.")
}
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("Tables:")
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.Tables {
log.Printf("Table %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
Contoh berikut menunjukkan cara mencantumkan tabel menggunakan SDK 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 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("No tables found.");
}
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Cantumkan tabel dengan memanggil operasi ListTables.
Ubah nama dan pindahkan tabel
Gunakan operasi API RenameTable untuk melakukan tindakan berikut:
Ubah nama tabel: Mengganti nama tabel sambil tetap berada di namespace yang sama.
Pindahkan tabel: Memindahkan tabel ke namespace berbeda dalam table bucket yang sama.
Operasi ini mendukung versionToken untuk kunci optimis guna mencegah konflik data akibat operasi konkuren.
ossutil
Perintah berikut menunjukkan cara mengubah nama tabel dengan 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
Kode berikut menunjukkan cara mengubah nama tabel dengan SDK Python:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="rename table sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSSTables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The current name of the table.', required=True)
parser.add_argument('--new-namespace-name', help='The new namespace name for the table.')
parser.add_argument('--new-name', help='The new name for the table.')
parser.add_argument('--version-token', help='The version token for the table.')
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'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'successfully renamed table: {args.namespace}/{args.name}')
if __name__ == "__main__":
main()Go
Kode berikut menunjukkan cara mengubah nama tabel dengan SDK 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
newName string
)
func init() {
flag.StringVar(®ion, "region", "", "The region where the table bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
flag.StringVar(&newName, "new-name", "", "The new name of the table.")
}
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(newName) == 0 {
flag.PrintDefaults()
log.Fatalf("invalid parameters, table new 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.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("failed to rename table %v", err)
}
log.Printf("rename table result:%#v\n", result)
}Java
Kode berikut menunjukkan cara mengubah nama tabel dengan SDK 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 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("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully renamed table from %s/%s to %s/%s%n",
namespace, name, namespace, newName);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan operasi API RenameTable untuk mengubah nama atau memindahkan tabel.
Hapus tabel
Operasi ini menghapus tabel yang ditentukan dan menghapus permanen semua data di dalamnya. Tindakan ini tidak dapat dikembalikan. Sebelum menghapus tabel, pastikan Anda memiliki cadangan data.
Konsol
Untuk menghapus tabel di Konsol OSS, ikuti langkah-langkah berikut:
Masuk ke Konsol OSS. Di panel navigasi kiri, pilih Daftar Table Bucket.
Klik nama Table Bucket target untuk membuka halaman detailnya.
Di tab Daftar Tabel, temukan tabel target dan klik Delete di kolom Actions.
Di kotak dialog konfirmasi, klik OK.
Ossutil
Gunakan perintah berikut untuk menghapus tabel dengan ossutil:
ossutil tables-api delete-table \
--table-bucket-arn acs:osstables:cn-hangzhou:1234567890:bucket/mytablebucket \
--namespace mynamespace \
--name mytableSDK
Python
Kode berikut menunjukkan cara menghapus tabel dengan SDK Python:
# Step 1: Delete a table
# Full sample: 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='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace of the table.', required=True)
parser.add_argument('--name', help='The name of the table.', required=True)
parser.add_argument('--version-token', help='The version token for optimistic locking.')
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'status code: {result.status_code},'
f' request id: {result.request_id}')
print(f'successfully deleted table: {args.namespace}/{args.name}')
if __name__ == "__main__":
main()
# ----------------------------------------------------------------
# Step 2: Delete a namespace (To delete a namespace, you must first delete all tables within it.)
# Full sample: 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='The region in which the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The domain names that other services can use to access OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The namespace to delete.', 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'successfully deleted namespace: {args.namespace}')
if __name__ == "__main__":
main()Go
Kode berikut menunjukkan cara menghapus tabel dengan SDK Go:
// Step 1: Delete a table
// Full sample: 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", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The name of the namespace.")
flag.StringVar(&name, "name", "", "The name of the table.")
}
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("failed to delete table %v", err)
}
log.Printf("delete table result:%#v\n", result)
}
// ----------------------------------------------------------------
// Step 2: Delete a namespace (To delete a namespace, you must first delete all tables within it.)
// Full sample: 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
)
func init() {
flag.StringVar(®ion, "region", "", "The region in which the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
}
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.DeleteNamespace(context.TODO(), &tables.DeleteNamespaceRequest{
TableBucketARN: oss.Ptr(tableBucketArn),
Namespace: oss.Ptr("my_space"),
})
if err != nil {
log.Fatalf("failed to delete namespace %v", err)
}
log.Printf("delete namespace result:%#v\n", result)
}Java
Kode berikut menunjukkan cara menghapus tabel dengan SDK 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 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("Status code: %d, request id: %s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully deleted table: %s/%s from bucket: %s%n",
namespace, tableName, tableBucketARN);
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan DeleteTable API untuk menghapus tabel.
Manajemen metadata
File metadata Iceberg untuk tabel berisi informasi penting, seperti skema tabel, riwayat snapshot, dan spesifikasi partisi. Manajemen metadata melibatkan dua properti utama berikut:
metadataLocation: Jalur penyimpanan untuk file metadata. Setelah setiap commit Iceberg, sistem menghasilkan file metadata baru. Jalurnya dalam format
oss://{tableId}--table-oss/metadata/00000-{uuid}.metadata.json.versionToken: Mengidentifikasi versi metadata. Token ini berubah setelah setiap pembaruan metadata. Saat melakukan operasi UpdateTableMetadataLocation atau RenameTable, Anda harus menyertakan token versi saat ini untuk menerapkan kunci optimis.
ossutil
Ambil lokasi metadata:
ossutil tables-api get-table-metadata-location --table-bucket-arn {ARN} --namespace {ns} --name {table}Perbarui lokasi metadata:
ossutil tables-api update-table-metadata-location --table-bucket-arn {ARN} --namespace {ns} --name {table} --metadata-location {location} --version-token {token}SDK
Python
Ambil lokasi metadata:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="get table metadata location sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The table namespace.', required=True)
parser.add_argument('--name', help='The table name.', 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()Perbarui lokasi metadata:
import argparse
import alibabacloud_oss_v2 as oss
import alibabacloud_oss_v2.tables as oss_tables
parser = argparse.ArgumentParser(description="update table metadata location sample")
parser.add_argument('--region', help='The region where the table bucket is located.', required=True)
parser.add_argument('--endpoint', help='The endpoint for accessing OSS Tables.')
parser.add_argument('--table-bucket-arn', help='The ARN of the table bucket.', required=True)
parser.add_argument('--namespace', help='The table namespace.', required=True)
parser.add_argument('--name', help='The table name.', required=True)
parser.add_argument('--version-token', help='The version token.', required=True)
parser.add_argument('--metadata-location', help='The new metadata location.', 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
Ambil lokasi metadata:
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", "", "The region where the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The table namespace.")
flag.StringVar(&name, "name", "", "The table 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("failed to get table metadata location %v", err)
}
log.Printf("get table metadata location result:%#v\n", result)
}Perbarui lokasi metadata:
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", "", "The region where the bucket is located.")
flag.StringVar(&tableBucketArn, "table-bucket-arn", "", "The ARN of the table bucket.")
flag.StringVar(&namespace, "namespace", "", "The table namespace.")
flag.StringVar(&name, "name", "", "The table name.")
flag.StringVar(&metadataLocation, "metadata-location", "", "The table's metadata location.")
flag.StringVar(&versionToken, "version-token", "", "The table's 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("failed to update table metadata location %v", err)
}
log.Printf("update table metadata location result:%#v\n", result)
}Java
Ambil lokasi metadata:
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("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Metadata location: %s%n", result.metadataLocation());
System.out.printf("Version token: %s%n", result.versionToken());
System.out.printf("Warehouse location: %s%n", result.warehouseLocation());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}Perbarui lokasi metadata:
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("Status code:%d, request id:%s%n",
result.statusCode(), result.requestId());
System.out.printf("Successfully updated table metadata location for table: %s%n", name);
System.out.printf("New metadata location: %s%n", result.metadataLocation());
System.out.printf("New version token: %s%n", result.versionToken());
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
}
}
}API
Gunakan operasi GetTableMetadataLocation untuk mengambil lokasi metadata.
Gunakan operasi UpdateTableMetadataLocation untuk memperbarui lokasi metadata.
Kuota dan batasan
Item | Description |
Jumlah tabel per table bucket | Maksimal 10.000. Jika Anda memerlukan kuota lebih tinggi, hubungi Dukungan Teknis. |
Jumlah namespace per table bucket | Maksimal 10.000. |
Jumlah bucket tabel | Setiap akun dapat membuat hingga 10 table buckets di setiap wilayah. |
Panjang nama table bucket | 3 hingga 32 karakter. |
Panjang nama tabel | 1 hingga 255 karakter. |
Karakter yang valid untuk nama bucket tabel | Hanya boleh berisi huruf kecil, angka, dan tanda hubung (-), serta tidak boleh diawali atau diakhiri dengan tanda hubung. |
Awalan yang tidak diperbolehkan untuk nama table bucket | Tidak boleh diawali dengan oss, acs, aliyun, alibaba, atau aws. |
Karakter valid untuk nama tabel | Hanya boleh berisi huruf kecil, angka, dan garis bawah (_), serta tidak boleh diawali atau diakhiri dengan garis bawah. |
Panjang nama namespace | 1 hingga 255 karakter. |
Karakter valid untuk nama namespace | Hanya boleh berisi huruf kecil, angka, dan garis bawah (_), serta tidak boleh diawali atau diakhiri dengan garis bawah. |
Algoritma enkripsi | Hanya AES256 yang didukung. |
Format tabel | Hanya Iceberg yang didukung. |
Penagihan
OSS Tables tersedia tanpa biaya selama masa uji berbasis undangan. Silakan periksa situs web resmi untuk pengumuman tentang peluncuran komersial.