All Products
Search
Document Center

MaxCompute:CREATE TABLE

Last Updated:Mar 28, 2026

CREATE TABLE membuat tabel non-partisi, partisi, eksternal, atau terkluster.

Batasan

  • Tabel partisi dapat memiliki hingga enam level partisi. Misalnya, tabel yang dipartisi berdasarkan tanggal mungkin menggunakan level year/month/week/day/hour/minute.

  • Secara default, sebuah tabel dapat memiliki hingga 60.000 partisi. Batasan ini dapat dikonfigurasi per Proyek.

Untuk batasan tabel lainnya, lihat Batasan MaxCompute SQL.

Sintaks

Tabel internal

Buat tabel internal (non-partisi atau partisi)

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type> [COMMENT <col_comment>], ...)]
[AUTO PARTITIONED 
   BY (<auto_partition_expression> [AS <auto_partition_column_name>])
  [TBLPROPERTIES('ingestion_time_partition'='true')]
];

Tabel terkluster

Buat tabel terkluster

CREATE TABLE [IF NOT EXISTS] <table_name> (
<col_name> <data_type>, ... )
[CLUSTERED BY | RANGE CLUSTERED BY (<col_name> [, <col_name>, ...]) 
[SORTED BY (<col_name> [ASC | DESC] [, <col_name> [ASC | DESC] ...])] 
INTO <number_of_buckets> BUCKETS];

Tabel eksternal

Buat tabel eksternal

Contoh berikut menunjukkan cara membuat tabel eksternal OSS dengan menggunakan parser data teks bawaan. Untuk informasi selengkapnya, lihat Tabel eksternal ORC.

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> ( 
<col_name> <data_type>, ... ) 
STORED AS '<file_format>' 
[WITH SERDEPROPERTIES (options)]  
LOCATION '<oss_location>';

Tabel transaksional dan Delta

  • Membuat tabel transaksional. Anda dapat menjalankan operasi UPDATE atau DELETE pada jenis tabel ini. Namun, tabel transaksional memiliki beberapa keterbatasan.

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> (
    <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ...   
    [COMMENT <table_comment>]
    [TBLPROPERTIES ("transactional"="true")];
  • Membuat tabel Delta. Ketika dikombinasikan dengan primary key, Anda dapat melakukan operasi seperti upsert, kueri inkremental, dan time travel.

    CREATE [EXTERNAL] TABLE [IF NOT EXISTS] <table_name> (
    <col_name <data_type> [NOT NULL] [DEFAULT <default_value>] [COMMENT <col_comment>], ...   
    [PRIMARY KEY (<pk_col_name>[, <pk_col_name2>, ...] )]) 
    [COMMENT <table_comment>]
    [CLUSTERED BY (<pk_col_name>[, <pk_col_name2>, ...] )]
    [TBLPROPERTIES ("transactional"="true" 
    [, "write.bucket.num" = "N", "acid.data.retain.hours"="hours"...])] [LIFECYCLE <days>];
    • Tabel Delta dengan primary key memungkinkan Anda menggunakan subset dari primary key sebagai kunci kluster hash.

      Pada tabel Delta dengan primary key, sistem mendistribusikan data menggunakan hash clustering secara default. Kunci kluster default adalah seluruh set kolom primary key. Dalam beberapa skenario bisnis, kueri sering kali menyaring data berdasarkan subset kolom primary key. Untuk skenario tersebut, Anda dapat secara eksplisit menentukan subset dari primary key sebagai kunci kluster. Hal ini memastikan bahwa data didistribusikan dan disimpan berdasarkan subset tersebut, sehingga meningkatkan performa penyaringan.

    • Jika Anda secara eksplisit menentukan kunci kluster, sistem mendistribusikan data tabel ke dalam bucket hash berdasarkan kolom yang ditentukan. Kunci kluster harus merupakan subset dari kolom primary key.

      Jika Anda tidak secara eksplisit menentukan kunci kluster, sistem menggunakan seluruh set kolom primary key sebagai kunci kluster default.

      Anda tidak dapat mengubah kunci kluster setelah tabel dibuat. Anda harus menentukannya saat membuat tabel.

Klausa CTAS dan LIKE

  • Membuat tabel baru berdasarkan tabel yang sudah ada dan menyalin datanya tetapi tidak menyalin properti partisi. Klausa ini berlaku untuk tabel eksternal dan tabel di Proyek Lakehouse eksternal.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>;
  • Membuat tabel baru dengan struktur yang sama seperti tabel yang sudah ada tetapi tidak menyalin datanya. Klausa ini berlaku untuk tabel eksternal dan tabel di Proyek Lakehouse eksternal.

    CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>;

Parameter

Parameter umum

Parameter umum

Parameter

Wajib

Deskripsi

Keterangan

OR REPLACE

Tidak

  • Jika tabel dengan nama yang sama sudah ada, tabel tersebut akan dihapus dan diganti dengan tabel baru.

  • CREATE OR REPLACE TABLE tidak dapat digunakan bersama klausa berikut:

    • CREATE TABLE ... IF NOT EXISTS

    • CREATE TABLE ... AS SELECT

    • CREATE TABLE ... LIKE

Ini setara dengan menjalankan perintah berikut:

DROP TABLE IF EXISTS <tableName>;  -- Jika tabel ada, hapus.
CREATE TABLE <tableName> ...;      -- Buat tabel baru.

EXTERNAL

Tidak

Membuat tabel eksternal.

N/A

IF NOT EXISTS

Tidak

Hanya membuat tabel jika belum ada tabel dengan nama yang sama.

Jika Anda tidak menentukan opsi IF NOT EXISTS dan tabel dengan nama yang sama sudah ada, kesalahan akan dilaporkan. Jika Anda menentukan IF NOT EXISTS, operasi berhasil meskipun tabel dengan nama yang sama sudah ada, bahkan jika skema tabel yang ada tidak sesuai dengan skema tabel yang akan dibuat. Metadata tabel yang ada tidak berubah.

table_name

Ya

Nama tabel.

Nama tabel harus terdiri dari maksimal 128 byte dan hanya boleh berisi huruf, angka, serta garis bawah (_). Nama tidak peka huruf besar/kecil. Disarankan untuk memulai nama dengan huruf.

PRIMARY KEY(pk)

Tidak

Primary key tabel.

Anda dapat menentukan satu atau beberapa kolom sebagai primary key. Hal ini memastikan kombinasi nilai dalam kolom-kolom tersebut unik dalam tabel. Sintaks mengikuti sintaks primary key SQL standar. Kolom primary key harus diatur sebagai NOT NULL dan tidak dapat diubah.

Penting

Parameter ini hanya berlaku untuk Tabel Delta.

col_name

Ya

Nama kolom.

  • Nama kolom harus terdiri dari maksimal 128 byte dan hanya boleh berisi huruf, angka, garis bawah (_), atau karakter Tionghoa. Nama tidak peka huruf besar/kecil. Disarankan untuk memulai nama dengan huruf.

  • Jalankan perintah SET odps.sql.bigquery.compatible=true; untuk mengaktifkan mode kompatibilitas BigQuery. Dalam mode ini, panjang nama kolom dapat mencapai 256 byte. Jika tidak, kesalahan akan dikembalikan.

col_comment

Tidak

Komentar kolom.

Harus berupa string dengan panjang maksimal 1.024 byte.

data_type

Ya

Tipe data kolom.

Tipe data yang didukung meliputi BIGINT, DOUBLE, BOOLEAN, DATETIME, DECIMAL, dan STRING. Untuk informasi selengkapnya, lihat Tipe data.

NOT NULL

Tidak

Menentukan bahwa kolom tidak boleh berisi nilai NULL.

Untuk informasi lebih lanjut tentang cara mengubah properti NOT NULL, lihat Operasi partisi.

default_value

Tidak

Nilai default untuk kolom.

Jika operasi insert tidak menentukan nilai untuk kolom ini, nilai default akan ditulis ke kolom tersebut.

Catatan

Fungsi seperti GETDATE() dan NOW() tidak didukung sebagai nilai default.

table_comment

Tidak

Komentar tabel.

Harus berupa string dengan panjang maksimal 1.024 byte.

LIFECYCLE

Tidak

Siklus hidup tabel, dalam satuan hari.

Hanya mendukung bilangan bulat positif. Satuannya adalah hari.

  • Untuk tabel non-partisi, siklus hidup dimulai sejak waktu modifikasi data terakhir. Jika data tidak dimodifikasi selama jumlah hari yang ditentukan, MaxCompute secara otomatis mereklaim tabel tersebut, yang setara dengan operasi DROP TABLE.

  • Untuk tabel partisi, sistem menentukan apakah suatu partisi perlu direklaim berdasarkan LastModifiedTime-nya. Berbeda dengan tabel non-partisi, tabel itu sendiri tidak dihapus setelah partisi terakhirnya direklaim. Siklus hidup hanya dapat diatur pada tingkat tabel, bukan pada tingkat partisi.

Tabel partisi

Parameter tabel partisi

Parameter tabel partisi

MaxCompute mendukung dua jenis tabel partisi: standar dan auto-partisi. Anda dapat memilih jenis tabel berdasarkan cara Anda ingin menghasilkan kolom partisi untuk kasus penggunaan Anda. Untuk informasi selengkapnya, lihat Ikhtisar tabel partisi.

Parameter tabel partisi standar

Parameter

Wajib

Deskripsi

Keterangan

PARTITIONED BY

Ya

Menentukan partisi untuk tabel partisi standar.

Anda dapat menentukan partisi menggunakan PARTITIONED BY atau AUTO PARTITIONED BY, tetapi tidak keduanya sekaligus.

col_name

Ya

Nama kolom partisi.

  • Nama kolom harus terdiri dari maksimal 128 byte dan hanya boleh berisi huruf, angka, garis bawah (_), atau karakter Tionghoa. Nama tidak peka huruf besar/kecil. Disarankan untuk memulai nama dengan huruf.

  • Jalankan perintah SET odps.sql.bigquery.compatible=true; untuk mengaktifkan mode kompatibilitas BigQuery. Dalam mode ini, panjang nama kolom dapat mencapai 256 byte. Jika tidak, kesalahan akan dikembalikan.

data_type

Ya

Tipe data kolom partisi.

MaxCompute V1.0 hanya mendukung tipe STRING. MaxCompute V2.0 mendukung tipe partisi tambahan, termasuk TINYINT, SMALLINT, INT, BIGINT, VARCHAR, dan STRING. Untuk informasi selengkapnya, lihat Tipe data. Saat Anda mempartisi tabel, operasi seperti menambah partisi, memperbarui data, dan membaca data tidak memerlukan pemindaian tabel penuh, sehingga meningkatkan efisiensi.

col_comment

Tidak

Komentar untuk kolom partisi.

Harus berupa string dengan panjang maksimal 1.024 byte.

Catatan

Nilai partisi harus terdiri dari maksimal 255 byte. Nilai tersebut tidak boleh berisi karakter double-byte, seperti karakter Tionghoa. Nilai harus dimulai dengan huruf dan hanya boleh berisi huruf, angka, serta karakter berikut: spasi, titik dua (:), garis bawah (_), tanda dolar ($), tanda pagar (#), titik (.), tanda seru (!), dan tanda at (@). Perilaku karakter lain, seperti karakter escape \t, \n, dan /, tidak terdefinisi.

Parameter tabel auto-partisi

Kolom partisi untuk tabel auto-partisi dapat dihasilkan secara otomatis. Untuk informasi lebih lanjut tentang cara menggunakan tabel auto-partisi, lihat Jenis tabel partisi.

Parameter

Wajib

Deskripsi

Keterangan

AUTO PARTITIONED BY

Ya

Menentukan partisi untuk tabel auto-partisi.

Anda dapat menentukan partisi menggunakan PARTITIONED BY atau AUTO PARTITIONED BY, tetapi tidak keduanya sekaligus.

auto_partition_expression

Ya

Ekspresi yang menentukan cara menghitung kolom partisi.

Saat ini, hanya fungsi TRUNC_TIME yang dapat digunakan untuk menghasilkan kolom partisi. Hanya satu kolom partisi yang didukung.

Fungsi TRUNC_TIME dapat memotong data dari kolom bertipe waktu atau tanggal berdasarkan unit waktu tertentu untuk menghasilkan kolom partisi.

auto_partition_column_name

Tidak

Nama kolom partisi yang dihasilkan.

Jika nama tidak ditentukan, sistem menggunakan _pt_col_0_ sebagai nama default. Jika nama ini sudah digunakan, sistem akan menambahkan angka pada akhiran (misalnya, _pt_col_1_ atau _pt_col_2_) hingga menemukan nama yang belum digunakan.

Berdasarkan perhitungan dari ekspresi partisi, kolom partisi bertipe STRING dihasilkan. Anda dapat secara eksplisit menentukan nama untuk kolom ini, tetapi Anda tidak dapat langsung mengubah tipe data atau nilainya.

TBLPROPERTIES('ingestion_time_partition'='true')

Tidak

Menentukan apakah kolom partisi dihasilkan berdasarkan waktu pemasukan data.

Untuk informasi lebih lanjut tentang pembuatan partisi berdasarkan waktu pemasukan data, lihat Tabel auto-partisi berdasarkan waktu pemasukan data.

Tabel terkluster

Parameter tabel terkluster

Tabel terkluster dikategorikan menjadi tabel hash-clustered dan tabel range-clustered.

Tabel hash-clustered

Parameter

Wajib

Deskripsi

Keterangan

CLUSTERED BY

Ya

Menentukan kunci hash. MaxCompute menghitung nilai hash untuk kolom yang ditentukan dan mendistribusikan data ke dalam bucket hash berdasarkan nilai-nilai tersebut.

MaxCompute melakukan operasi hash pada kolom yang ditentukan dan mendistribusikan data ke dalam bucket berdasarkan nilai hash. Untuk mencegah kesenjangan data dan hotspots serta mencapai performa eksekusi paralel yang baik, pilih kolom yang memiliki rentang nilai luas dan sedikit kunci duplikat untuk klausa CLUSTERED BY. Selain itu, untuk optimasi join, pertimbangkan juga memilih kunci Join atau Agregasi yang sering digunakan, yang mirip dengan primary key pada database tradisional.

SORTED BY

Ya

Menentukan urutan pengurutan kolom dalam setiap bucket hash.

Untuk performa optimal, gunakan kolom yang sama untuk SORTED BY dan CLUSTERED BY. Setelah Anda menentukan klausa SORTED BY, MaxCompute secara otomatis membuat Indeks dan menggunakannya untuk mempercepat kueri.

number_of_buckets

Ya

Menentukan jumlah bucket hash.

Nilai ini wajib dan bergantung pada volume data. Secara default, MaxCompute mendukung maksimal 1.111 reducer, yang membatasi jumlah bucket hash hingga 1.111. Anda dapat menjalankan perintah set odps.stage.reducer.num =<concurrency>; untuk meningkatkan batas ini, tetapi nilainya tidak boleh melebihi 4.000. Nilai yang terlalu tinggi dapat menurunkan performa.

Catatan

Saat memilih jumlah bucket hash, ikuti dua prinsip berikut:

  • Pertahankan ukuran bucket hash yang moderat: Ukuran yang direkomendasikan untuk setiap bucket hash adalah sekitar 500 MB. Misalnya, jika perkiraan ukuran partisi adalah 500 GB, atur jumlah bucket menjadi 1.000. Ini menghasilkan ukuran rata-rata bucket hash sekitar 500 MB. Untuk tabel yang sangat besar, Anda dapat melebihi batas 500 MB. Ukuran 2 GB hingga 3 GB per bucket cocok. Anda juga dapat menjalankan perintah set odps.stage.reducer.num=<concurrency>; untuk melebihi batas 1.111 bucket hash.

  • Untuk mengoptimalkan operasi join, menghilangkan langkah shuffle dan sort secara signifikan meningkatkan performa. Hal ini memerlukan jumlah bucket hash pada kedua tabel saling kelipatan, misalnya 256 dan 512. Disarankan untuk mengatur jumlah bucket hash sebagai pangkat dua (2n), seperti 512, 1.024, 2.048, atau 4.096. Hal ini memungkinkan sistem secara otomatis membagi atau menggabungkan bucket hash dan menghilangkan langkah shuffle dan sort, sehingga meningkatkan efisiensi eksekusi.

Tabel range-clustered

Parameter

Wajib

Deskripsi

Keterangan

RANGE CLUSTERED BY

Ya

Menentukan kolom range-cluster.

MaxCompute melakukan operasi bucketing pada kolom yang ditentukan dan mendistribusikan data ke dalam bucket berdasarkan nomor bucket.

SORTED BY

Ya

Menentukan urutan pengurutan kolom dalam setiap bucket.

Penggunaannya sama seperti pada tabel hash-clustered.

number_of_buckets

Ya

Menentukan jumlah bucket.

Untuk tabel range-clustered, praktik terbaik menggunakan pangkat dua (2n) yang berlaku untuk tabel hash-clustered tidak diperlukan. Jumlah bucket apa pun dapat diterima asalkan data terdistribusi merata. Parameter ini opsional untuk tabel range-clustered. Jika Anda mengabaikannya, sistem secara otomatis menentukan jumlah bucket optimal berdasarkan volume data.

Saat operasi join atau agregasi dilakukan pada tabel range-clustered, jika kunci join atau kunci grup merupakan kunci range clustering atau awalannya, Anda dapat menghilangkan redistribusi data (shuffle remove) untuk meningkatkan performa. Anda dapat menjalankan perintah set odps.optimizer.enable.range.partial.repartitioning=true/false; untuk mengaktifkan atau menonaktifkan fitur ini. Fitur ini dinonaktifkan secara default.

Catatan
  • Manfaat tabel terkluster:

    • Pemangkasan bucket yang dioptimalkan

    • Agregasi yang dioptimalkan

    • Penyimpanan yang dioptimalkan

  • Keterbatasan tabel terkluster:

    • INSERT INTO tidak didukung. Anda hanya dapat menambahkan data dengan menggunakan INSERT OVERWRITE.

    • Mengunggah data langsung ke tabel range-clustered menggunakan Tunnel tidak didukung karena Tunnel mengunggah data secara tidak terurut.

    • Fitur backup dan pemulihan tidak didukung.

Tabel eksternal

Parameter tabel eksternal

Bagian ini menggunakan parameter untuk membuat tabel eksternal OSS sebagai contoh. Untuk informasi lebih lanjut tentang parameter untuk membuat jenis tabel eksternal lainnya, lihat Tabel eksternal.

Parameter

Wajib

Deskripsi

STORED AS '<file_format>'

Ya

Menentukan file_format berdasarkan format data tabel eksternal.

WITH SERDEPROPERTIES(options)

Tidak

Menentukan parameter terkait otorisasi, kompresi, dan parsing karakter untuk tabel eksternal.

oss_location

Ya

Lokasi penyimpanan OSS untuk data tabel eksternal. Untuk informasi selengkapnya, lihat Tabel eksternal OSS.

Tabel transaksional dan Delta

Parameter Tabel Transaksional dan Tabel Delta

Parameter Tabel Delta

Tabel Delta adalah format tabel yang mendukung pembacaan dan penulisan near-real-time, penyimpanan dan akses inkremental, serta pembaruan real-time. Saat ini, hanya tabel dengan primary key yang didukung.

Parameter

Wajib

Deskripsi

Keterangan

PRIMARY KEY(PK)

Ya

Menentukan primary key untuk Tabel Delta, yang dapat mencakup beberapa kolom.

Sintaks mengikuti sintaks primary key SQL standar. Kolom primary key harus diatur sebagai NOT NULL dan tidak dapat diubah. Setelah primary key ditentukan, data akan di-deduplicate berdasarkan kolom primary key. Kendala unik diberlakukan dalam satu partisi atau dalam tabel non-partisi.

transactional

Ya

Wajib untuk membuat Tabel Delta. Anda harus mengatur parameter ini ke true.

Menunjukkan bahwa tabel mendukung properti transaksional tabel ACID MaxCompute. Tabel menggunakan model Kontrol Konkurensi Multi-Versi (MVCC) untuk memastikan tingkat isolasi snapshot.

write.bucket.num

Tidak

Nilai default adalah 16. Rentang valid adalah (0, 4096].

Menentukan jumlah bucket untuk setiap partisi atau untuk tabel non-partisi. Ini juga menunjukkan jumlah node konkuren untuk penulisan data. Anda dapat mengubah parameter ini untuk tabel partisi, dan pengaturan baru berlaku untuk partisi baru. Anda tidak dapat mengubah parameter ini untuk tabel non-partisi. Pertimbangkan rekomendasi berikut:

  • Jika Anda mengimpor data menggunakan Tunnel, parameter ini menentukan jumlah node Tunnel konkuren. Pengaturan ini memengaruhi trafik impor dan juga dibatasi oleh jumlah maksimum node Tunnel konkuren.

  • Jika Anda menulis data menggunakan SQL, parameter ini menentukan tingkat konkurensi untuk reducer. Hal ini dibatasi oleh jumlah maksimum node reducer konkuren.

  • Ukuran yang direkomendasikan untuk setiap bucket adalah sekitar 500 MB data. Misalnya, jika perkiraan ukuran partisi adalah 500 GB, atur jumlah bucket menjadi 1.000. Untuk tabel yang sangat besar, Anda dapat meningkatkan ukuran bucket menjadi 2 GB hingga 3 GB.

acid.data.retain.hours

Tidak

Nilai default adalah 24. Rentang valid adalah [24, 168].

Menentukan rentang waktu dalam jam yang memungkinkan Anda mengkueri status data historis menggunakan Time Travel. Jika Anda memerlukan riwayat Time Travel lebih dari 168 jam (7 hari), hubungi dukungan teknis MaxCompute.

  • Nilai 0 menunjukkan bahwa status data historis tidak disimpan, dan kueri Time Travel tidak didukung.

  • Data historis yang lebih lama dari nilai yang ditentukan dapat dihapus atau dikompaksi.

  • Jika kueri Time Travel menentukan waktu yang lebih awal dari rentang yang diizinkan oleh parameter ini, kesalahan akan dikembalikan. Misalnya, jika nilai ini adalah 72, kueri untuk data lebih dari 72 jam yang lalu akan gagal.

acid.incremental.query.out.of.time.range.enabled

Tidak

Nilai default: false.

Jika true, endTimestamp dalam kueri inkremental dapat lebih baru daripada waktu commit data terbaru tabel. Dalam kasus ini, beberapa kueri dapat mengembalikan hasil yang berbeda karena data baru mungkin dimasukkan. Anda dapat mengubah nilai parameter ini untuk tabel yang sudah ada.

acid.write.precombine.field

Tidak

Menentukan nama satu kolom.

Jika nama kolom ditentukan, sistem menggunakan kolom ini bersama dengan kolom primary key untuk menghapus duplikat data dalam satu commit yang sama. Hal ini memastikan keunikan dan konsistensi data.

Catatan

Jika satu commit data melebihi 128 MB, beberapa file akan dihasilkan. Parameter ini tidak berlaku lintas beberapa file.

acid.partial.fields.update.enable

Tidak

Jika diatur ke true, Anda dapat melakukan pembaruan kolom parsial pada Tabel Delta menggunakan SQL atau Tunnel.

Parameter ini diatur saat Anda membuat tabel. Parameter ini tidak dapat diubah setelah tabel dibuat.

  • Persyaratan parameter lain untuk Tabel Delta:

    • LIFECYCLE: Siklus hidup tabel harus lebih besar dari atau sama dengan periode retensi time travel, yaitu lifecycle >= acid.data.retain.hours / 24. Pemeriksaan dilakukan saat tabel dibuat, dan kesalahan akan dilaporkan jika kondisi ini tidak terpenuhi.

    • Fitur yang tidak didukung: CLUSTERED BY, EXTERNAL, dan CREATE TABLE AS tidak didukung.

  • Keterbatasan lain:

    • Saat ini, engine lain tidak dapat langsung beroperasi pada Tabel Delta. Hanya MaxCompute SQL yang didukung.

    • Anda tidak dapat mengonversi tabel standar menjadi Tabel Delta.

    • Anda tidak dapat melakukan perubahan skema pada kolom primary key Tabel Delta.

Parameter Tabel Transaksional

Parameter

Wajib

Deskripsi

TBLPROPERTIES("transactional"="true")

Ya

Menetapkan tabel sebagai Tabel Transaksional. Anda kemudian dapat melakukan operasi update dan delete untuk memperbarui atau menghapus data pada tingkat baris. Untuk informasi selengkapnya, lihat Perbarui atau hapus data (UPDATE | DELETE).

Keterbatasan berikut berlaku untuk Tabel Transaksional:

  • Anda hanya dapat mengatur properti transactional saat membuat tabel. Anda tidak dapat menggunakan ALTER TABLE untuk mengubah properti ini pada tabel yang sudah ada. Pernyataan berikut mengembalikan kesalahan:

    ALTER TABLE not_txn_tbl SET TBLPROPERTIES("transactional"="true");
    -- Error returned.
    FAILED: Catalog Service Failed, ErrorCode: 151, Error Message: Set transactional is not supported
  • Anda tidak dapat menetapkan tabel terkluster atau tabel eksternal sebagai Tabel Transaksional.

  • Anda tidak dapat mengonversi tabel internal standar, tabel eksternal, atau tabel terkluster menjadi Tabel Transaksional, atau sebaliknya.

  • Pemadatan otomatis file dalam Tabel Transaksional tidak didukung. Anda harus melakukan operasi ini secara manual. Untuk informasi selengkapnya, lihat Memadatkan file dalam Tabel Transaksional.

  • Operasi merge partition tidak didukung.

  • Akses ke Tabel Transaksional dari sistem lain terbatas. Misalnya, MaxCompute Graph tidak mendukung operasi baca atau tulis. Spark dan PAI hanya mendukung operasi baca.

  • Sebelum melakukan operasi update, delete, atau insert overwrite pada data penting, cadangkan secara manual ke tabel lain menggunakan pernyataan SELECT ... INSERT.

Buat tabel dari tabel yang sudah ada

Buat tabel (dari yang sudah ada)

  • Anda dapat menggunakan pernyataan CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>; untuk membuat tabel lain dan sekaligus menyalin data ke tabel baru tersebut.

    • Pernyataan ini tidak menyalin properti partisi. Kolom partisi dari tabel sumber diperlakukan sebagai kolom biasa di tabel tujuan. Properti lifecycle dari tabel sumber juga tidak disalin.

    • Anda dapat menggunakan parameter lifecycle untuk menentukan siklus hidup untuk tabel baru. Pernyataan ini juga mendukung pembuatan tabel internal dan penyalinan data dari tabel eksternal.

  • Anda dapat menggunakan pernyataan CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] LIKE <existing_table_name>; untuk membuat tabel baru dengan skema yang sama seperti tabel yang sudah ada.

    • Pernyataan ini menyalin skema tetapi tidak menyalin data atau properti lifecycle dari tabel sumber.

    • Anda dapat menggunakan parameter lifecycle untuk menentukan siklus hidup untuk tabel baru. Pernyataan ini juga mendukung pembuatan tabel internal yang menyalin skema dari tabel eksternal.

Contoh

Tabel non-partisi

  • Buat tabel non-partisi.

    CREATE TABLE test1 (key STRING);
  • Buat tabel non-partisi dan tentukan nilai default untuk kolom.

    CREATE TABLE test_default( 
    tinyint_name tinyint NOT NULL default 1Y,
    smallint_name SMALLINT NOT NULL DEFAULT 1S,
    int_name INT NOT NULL DEFAULT 1,
    bigint_name BIGINT NOT NULL DEFAULT 1,
    binary_name BINARY ,
    float_name FLOAT ,
    double_name DOUBLE NOT NULL DEFAULT 0.1,
    decimal_name DECIMAL(2, 1) NOT NULL DEFAULT 0.0BD,
    varchar_name VARCHAR(10) ,
    char_name CHAR(2) ,
    string_name STRING NOT NULL DEFAULT 'N',
    boolean_name BOOLEAN NOT NULL DEFAULT TRUE
    );

Tabel partisi

  • Buat tabel partisi standar.

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE)
    PARTITIONED BY (sale_date STRING, region STRING);
  • Buat tabel partisi AUTO PARTITION yang menghasilkan partisi berdasarkan kolom data berbasis waktu menggunakan fungsi waktu.

    -- Kolom sale_date dipotong berdasarkan bulan untuk menghasilkan kolom partisi bernama sale_month. Tabel kemudian dipartisi berdasarkan kolom ini.
    CREATE TABLE IF NOT EXISTS auto_sale_detail(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE,
     sale_date    DATE )
    AUTO PARTITIONED BY (TRUNC_TIME(sale_date, 'month') AS sale_month);
  • Buat tabel partisi AUTO PARTITION yang menghasilkan partisi berdasarkan waktu pemasukan data. Sistem secara otomatis mengambil waktu ketika data ditulis ke MaxCompute dan menghasilkan partisi menggunakan fungsi waktu.

    -- Setelah tabel dibuat, saat data ditulis, sistem secara otomatis menangkap waktu pemasukan data (_partitiontime), memotongnya berdasarkan hari, menghasilkan kolom partisi bernama sale_date, lalu mempartisi tabel berdasarkan kolom ini.
    CREATE TABLE IF NOT EXISTS auto_sale_detail2(
     shop_name     STRING,
     customer_id   STRING,
     total_price   DOUBLE,
     _partitiontime TIMESTAMP_NTZ)
    AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date)
    TBLPROPERTIES('ingestion_time_partition'='true');

Tabel hash atau range clustered

  • Buat tabel non-partisi hash-clustered.

    CREATE TABLE t1 (a STRING, b STRING, c BIGINT) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Buat tabel partisi hash-clustered.

    CREATE TABLE t2 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Buat tabel non-partisi range-clustered.

    CREATE TABLE t3 (a STRING, b STRING, c BIGINT) RANGE CLUSTERED BY (c) SORTED BY (c) INTO 1024 buckets;
  • Buat tabel partisi range-clustered.

    CREATE TABLE t4 (a STRING, b STRING, c BIGINT) 
    PARTITIONED BY (dt STRING) RANGE CLUSTERED BY (c) SORTED BY (c); 

Tabel transaksional

  • Buat tabel transaksional non-partisi.

    CREATE TABLE t5(id BIGINT) TBLPROPERTIES ("transactional"="true");
  • Buat tabel transaksional partisi.

    CREATE TABLE IF NOT EXISTS t6(id BIGINT) 
    PARTITIONED BY (ds STRING) TBLPROPERTIES ("transactional"="true");

Tabel internal

  • Buat tabel internal dengan menyalin data dari tabel partisi eksternal. Tabel internal tidak akan menyertakan properti partisi.

    1. Buat tabel eksternal OSS dan tabel internal MaxCompute. Buat tabel internal menggunakan CREATE TABLE AS.

      -- Buat tabel eksternal OSS dan masukkan data ke dalamnya.
      CREATE EXTERNAL TABLE max_oss_test(a INT, b INT, c INT) 
      STORED AS TEXTFILE
      LOCATION "oss://oss-cn-hangzhou-internal.aliyuncs.com/<bucket_name>";
      
      INSERT INTO max_oss_test VALUES 
      (101, 1, 20241108),
      (102, 2, 20241109),
      (103, 3, 20241110);
      
      SELECT * FROM max_oss_test;
      
      -- Result
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
      
      
      -- Buat tabel internal menggunakan CREATE TABLE AS.
      CREATE TABLE from_exetbl_oss AS SELECT * FROM max_oss_test;
      
      -- Kueri tabel internal baru.
      SELECT * FROM from_exetbl_oss;
      
      -- Hasil menunjukkan bahwa semua data disalin.
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
    2. Jalankan perintah DESC from_exetbl_oss; untuk melihat skema tabel internal. Perintah mengembalikan output berikut.

      +------------------------------------------------------------------------------------+
      | Owner:                    ALIYUN$***********                                       |
      | Project:                  ***_*****_***                                            |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2023-01-10 15:16:33                                      |
      | LastDDLTime:              2023-01-10 15:16:33                                      |
      | LastModifiedTime:         2023-01-10 15:16:33                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 919                                                |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | a               | string     |       |                                             |
      | b               | string     |       |                                             |
      | c               | string     |       |                                             |
      +------------------------------------------------------------------------------------+
  • Buat tabel internal dengan menyalin skema dari tabel partisi eksternal. Tabel internal menyertakan properti partisi.

    1. Buat tabel internal from_exetbl_like. Kueri tabel eksternal OSS dari MaxCompute. Buat tabel internal menggunakan CREATE TABLE LIKE.

      -- Kueri tabel eksternal OSS dari MaxCompute.
      SELECT * FROM max_oss_test;
      -- Result
      a    b    c
      101    1    20241108
      102    2    20241109
      103    3    20241110
      
      -- Buat tabel internal menggunakan CREATE TABLE LIKE.
      CREATE TABLE from_exetbl_like LIKE max_oss_test;
      
      -- Kueri tabel internal baru.
      SELECT * FROM from_exetbl_like;
      -- Result: Hanya skema tabel yang dikembalikan.
      a    b    c
    2. Jalankan perintah DESC from_exetbl_like; untuk melihat skema tabel internal. Perintah mengembalikan output berikut.

      +------------------------------------------------------------------------------------+
      | Owner:                    ALIYUN$************                                      |
      | Project:                  ***_*****_***                                            |
      | TableComment:                                                                      |
      +------------------------------------------------------------------------------------+
      | CreateTime:               2023-01-10 15:09:47                                      |
      | LastDDLTime:              2023-01-10 15:09:47                                      |
      | LastModifiedTime:         2023-01-10 15:09:47                                      |
      +------------------------------------------------------------------------------------+
      | InternalTable: YES      | Size: 0                                                  |
      +------------------------------------------------------------------------------------+
      | Native Columns:                                                                    |
      +------------------------------------------------------------------------------------+
      | Field           | Type       | Label | Comment                                     |
      +------------------------------------------------------------------------------------+
      | a               | string     |       |                                             |
      | b               | string     |       |                                             |
      +------------------------------------------------------------------------------------+
      | Partition Columns:                                                                 |
      +------------------------------------------------------------------------------------+
      | c               | string     |                                                     |
      +------------------------------------------------------------------------------------+

Tabel Delta

  • Buat Tabel Delta.

    CREATE TABLE mf_tt (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT) 
      TBLPROPERTIES ("transactional"="true");
  • Buat Tabel Delta dan atur properti tabel utama.

    CREATE TABLE mf_tt2 ( 
      pk BIGINT NOT NULL, 
      pk2 BIGINT NOT NULL, 
      val BIGINT, 
      val2 BIGINT, 
      PRIMARY KEY (pk, pk2)
    ) 
    TBLPROPERTIES (
      "transactional"="true", 
      "write.bucket.num" = "64", 
      "acid.data.retain.hours"="120"
    ) LIFECYCLE 7;

Metode lain

Ganti tabel yang sudah ada

  1. Buat tabel asli my_table dan masukkan data ke dalamnya.

    CREATE OR REPLACE TABLE my_table(a BIGINT);
    
    INSERT INTO my_table(a) VALUES (1),(2),(3);
  2. Gunakan OR REPLACE untuk membuat tabel baru dengan nama yang sama dan ubah kolomnya.

    CREATE OR REPLACE TABLE my_table(b STRING);
  3. Kueri tabel my_table. Kueri mengembalikan hasil berikut.

    +------------+
    | b          | 
    +------------+
    +------------+

    Pernyataan SQL berikut tidak valid:

    CREATE OR REPLACE TABLE IF NOT EXISTS my_table(b STRING);
    CREATE OR REPLACE TABLE my_table AS SELECT;
    CREATE OR REPLACE TABLE my_table LIKE newtable;
Salin data dan atur siklus hidup
-- Buat tabel baru bernama sale_detail_ctas1, salin data dari sale_detail ke dalamnya, dan atur siklus hidup.
SET odps.sql.allow.fullscan=true;
CREATE TABLE sale_detail_ctas1 LIFECYCLE 10 AS SELECT * FROM sale_detail;

Jalankan perintah DESC EXTENDED sale_detail_ctas1; untuk melihat detail seperti skema dan siklus hidup tabel.

Catatan

Dalam contoh ini, sale_detail adalah tabel partisi. Saat Anda menggunakan pernyataan CREATE TABLE ... AS select_statement ... untuk membuat tabel sale_detail_ctas1, properti partisi tidak disalin. Kolom partisi dari tabel sumber menjadi kolom biasa di tabel tujuan. Oleh karena itu, sale_detail_ctas1 adalah tabel non-partisi dengan lima kolom.

Gunakan konstanta untuk nilai kolom
Catatan

Jika Anda menggunakan konstanta sebagai nilai kolom dalam klausa SELECT, tentukan nama kolom. Jika tidak, kolom keempat dan kelima di tabel yang dibuat sale_detail_ctas3 akan menerima nama default seperti _c4 dan _c5.

  • Tentukan nama kolom.

    SET odps.sql.allow.fullscan=true;
    CREATE TABLE sale_detail_ctas2
    AS
    SELECT shop_name, customer_id, total_price, '2013' AS sale_date, 'China' AS region
    FROM sale_detail;
  • Jangan tentukan nama kolom.

    SET odps.sql.allow.fullscan=true;
    
    CREATE TABLE sale_detail_ctas3
    AS
    SELECT shop_name, customer_id, total_price, '2013', 'China' 
    FROM sale_detail;
Salin skema dan atur siklus hidup
CREATE TABLE sale_detail_like LIKE sale_detail LIFECYCLE 10;

Jalankan perintah DESC EXTENDED sale_detail_like; untuk melihat detail seperti skema dan siklus hidup tabel.

Catatan

Skema sale_detail_like identik dengan skema sale_detail. Semua properti, seperti nama kolom, komentar kolom, dan komentar tabel, disalin, kecuali properti siklus hidup. Namun, data di sale_detail tidak disalin ke tabel sale_detail_like.

Salin skema dari tabel eksternal
-- Buat tabel baru bernama mc_oss_extable_orc_like yang memiliki skema yang sama dengan tabel eksternal mc_oss_extable_orc.
CREATE TABLE mc_oss_extable_orc_like LIKE mc_oss_extable_orc;

Jalankan perintah DESC mc_oss_extable_orc_like; untuk melihat detail seperti skema tabel.

+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@***.aliyunid.com | Project: max_compute_7u************yoq              |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2022-08-11 11:10:47                                      |
| LastDDLTime:              2022-08-11 11:10:47                                      |
| LastModifiedTime:         2022-08-11 11:10:47                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 0                                                  |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field           | Type       | Label | Comment                                     |
+------------------------------------------------------------------------------------+
| id              | string     |       |                                             |
| name            | string     |       |                                             |
+------------------------------------------------------------------------------------+

Tipe data baru

SET odps.sql.type.system.odps2=true;
CREATE TABLE test_newtype (
    c1 TINYINT,
    c2 SMALLINT,
    c3 INT,
    c4 BIGINT,
    c5 FLOAT,
    c6 DOUBLE,
    c7 DECIMAL,
    c8 BINARY,
    c9 TIMESTAMP,
    c10 ARRAY<MAP<BIGINT,BIGINT>>,
    c11 MAP<STRING,ARRAY<BIGINT>>,
    c12 STRUCT<s1:STRING,s2:BIGINT>,
    c13 VARCHAR(20))
LIFECYCLE 1;

Perintah terkait

  • ALTER TABLE: Memodifikasi struktur atau properti tabel.

  • TRUNCATE: Menghapus semua data dari tabel.

  • DROP TABLE: Menghapus tabel.

  • DESC TABLE/VIEW: Menampilkan informasi tentang tabel internal MaxCompute, Tampilan, Tampilan yang di-materialisasi, tabel eksternal, tabel terkluster, atau tabel Transaksional.

  • SHOW: Menampilkan pernyataan SQL DDL untuk tabel, semua tabel dan Tampilan dalam Proyek, atau semua partisi dalam tabel.