All Products
Search
Document Center

MaxCompute:Membuat dan menghapus tabel

Last Updated:Aug 22, 2026

Buat dan hapus tabel non-partisi, partisi, eksternal, terkluster, transaksional, serta Delta di MaxCompute.

Type

Description

Required permission

Execution tools

CREATE TABLE

Membuat tabel non-partisi, partisi, eksternal, atau terkluster.

Memerlukan izin CreateTable pada Proyek.

Jalankan perintah ini di:

DROP TABLE

Menghapus tabel partisi atau non-partisi.

Memerlukan izin Drop pada tabel.

Membuat tabel

Buat tabel non-partisi, partisi, eksternal, atau terkluster.

Batasan

  • Tabel partisi dapat memiliki hingga enam level partisi. Misalnya, Anda dapat menggunakan tanggal sebagai kolom partisi dan menentukan level seperti year/month/week/day/hour/minute.

  • Jumlah maksimum partisi per tabel dapat dikonfigurasi berdasarkan per-Proyek, dengan nilai default 60.000.

Batasan tambahan untuk tabel didokumentasikan di Batasan SQL MaxCompute.

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 ini membuat tabel eksternal OSS menggunakan parser data teks bawaan. Format lain dibahas di 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

  • Buat tabel transaksional. Jenis tabel ini mendukung operasi UPDATE atau DELETE, namun memiliki sejumlah batasan.

    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")];
  • Buat tabel Delta. Ketika digabungkan dengan primary key, tabel ini memungkinkan 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 penggunaan subset dari primary key sebagai kunci kluster hash.

      Pada tabel Delta dengan primary key, sistem secara default menerapkan pengelompokan hash menggunakan seluruh primary key sebagai kunci kluster. Jika kueri sering melakukan filter pada subset kolom primary key, tentukan secara eksplisit subset tersebut sebagai kunci kluster untuk meningkatkan performa filtering.

    • 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 tidak ditentukan secara eksplisit, sistem menggunakan seluruh set kolom primary key sebagai kunci kluster default.

      Kunci kluster tidak dapat diubah setelah tabel dibuat; Anda harus menentukannya saat pembuatan tabel.

Klausa CTAS dan LIKE

  • Buat tabel baru berdasarkan tabel yang ada dan salin datanya, tetapi tanpa 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>;
  • Buat tabel baru dengan struktur yang sama seperti tabel yang ada, tetapi tanpa 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

Required

Description

Remarks

OR REPLACE

No

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

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

    • CREATE TABLE ... IF NOT EXISTS

Ini setara dengan menjalankan perintah berikut:

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

EXTERNAL

No

Membuat tabel eksternal.

N/A

IF NOT EXISTS

No

Membuat tabel hanya jika belum ada tabel dengan nama yang sama.

Tanpa IF NOT EXISTS, membuat tabel dengan nama duplikat menghasilkan error. Dengan IF NOT EXISTS, pernyataan berhasil meskipun tabel dengan nama yang sama sudah ada dengan skema berbeda. Metadata tabel yang ada tetap tidak berubah.

table_name

Yes

Nama tabel.

Nama tabel harus terdiri dari 128 byte atau kurang dan hanya boleh berisi huruf, angka, serta garis bawah (_). Nama bersifat case-insensitive. Disarankan untuk memulai nama dengan huruf.

PRIMARY KEY(pk)

No

Primary key tabel.

Tentukan satu atau beberapa kolom sebagai primary key untuk memastikan keunikan kombinasi kolom tersebut. Mengikuti sintaks standard SQL untuk primary key. Kolom primary key harus NOT NULL dan tidak dapat dimodifikasi.

Penting

Parameter ini hanya berlaku untuk Tabel Delta.

col_name

Yes

Nama kolom.

  • Nama kolom harus terdiri dari 128 byte atau kurang dan hanya boleh berisi huruf, angka, garis bawah (_), atau karakter Tionghoa. Nama bersifat case-insensitive. Disarankan untuk memulai nama dengan huruf.

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

col_comment

No

Komentar kolom.

Harus berupa string sepanjang 1.024 byte atau kurang.

data_type

Yes

Tipe data kolom.

Tipe yang didukung: BIGINT, DOUBLE, BOOLEAN, DATETIME, DECIMAL, STRING, dan lainnya yang tercantum di Tipe data.

NOT NULL

No

Menentukan bahwa kolom tidak boleh berisi nilai NULL.

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

default_value

No

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

No

Komentar tabel.

Harus berupa string sepanjang 1.024 byte atau kurang.

LIFECYCLE

No

Siklus hidup tabel, dalam satuan hari.

Hanya bilangan bulat positif yang didukung. 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 akan direklaim berdasarkan LastModifiedTime-nya. Berbeda dengan tabel non-partisi, tabel itu sendiri tidak dihapus setelah partisi terakhirnya direklaim. Siklus hidup hanya dapat diatur di tingkat tabel, bukan di tingkat partisi.

Parameter tabel partisi

Parameter tabel partisi

MaxCompute mendukung tabel partisi standar dan otomatis. Pilih jenisnya berdasarkan cara kolom partisi dihasilkan. Lihat Ikhtisar tabel partisi.

Parameter tabel partisi standar

Parameter

Required

Description

Remarks

PARTITIONED BY

Yes

Menentukan partisi untuk tabel partisi standar.

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

col_name

Yes

Nama kolom partisi.

  • Nama kolom harus terdiri dari 128 byte atau kurang dan hanya boleh berisi huruf, angka, garis bawah (_), atau karakter Tionghoa. Nama bersifat case-insensitive. Disarankan untuk memulai nama dengan huruf.

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

data_type

Yes

Tipe data kolom partisi.

MaxCompute V1.0 hanya mendukung STRING. V2.0 menambahkan TINYINT, SMALLINT, INT, BIGINT, dan VARCHAR (STRING tetap didukung). Daftar lengkap tersedia di Tipe data. Partisi menghilangkan pemindaian tabel penuh untuk operasi tingkat partisi.

col_comment

No

Komentar untuk kolom partisi.

Harus berupa string sepanjang 1.024 byte atau kurang.

Catatan

Nilai partisi harus terdiri dari maksimal 255 byte dan 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 partisi otomatis

Tabel partisi otomatis menghasilkan kolom partisi secara otomatis. Detail penggunaannya tersedia di Jenis tabel partisi.

Parameter

Required

Description

Remarks

AUTO PARTITIONED BY

Yes

Menentukan partisi untuk tabel partisi otomatis.

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

auto_partition_expression

Yes

Ekspresi yang menentukan cara kolom partisi dihitung.

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

No

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 ditemukan 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 memodifikasi tipe data atau nilainya.

TBLPROPERTIES('ingestion_time_partition'='true')

No

Menentukan apakah kolom partisi dihasilkan berdasarkan waktu pemasukan data.

Partisi berdasarkan waktu pemasukan data dijelaskan di Tabel partisi otomatis berdasarkan waktu pemasukan data.

Parameter tabel terkluster

Parameter tabel terkluster

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

Tabel hash-clustered

Parameter

Required

Description

Remarks

CLUSTERED BY

Yes

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

Untuk mencegah kesenjangan data dan mencapai paralelisme yang baik, pilih kolom dengan kardinalitas tinggi dan sedikit duplikat untuk klausa CLUSTERED BY. Untuk optimasi join, pilih kunci join atau agregasi yang sering digunakan.

SORTED BY

Yes

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

Yes

Menentukan jumlah bucket hash.

Nilai ini wajib dan nilainya bergantung pada volume data.

Catatan

Saat memilih jumlah bucket hash, ikuti dua prinsip berikut:

  • Pertahankan ukuran bucket hash yang moderat: Ukuran yang disarankan untuk setiap bucket hash adalah sekitar 500 MB. Misalnya, jika perkiraan ukuran partisi adalah 500 GB, atur jumlah bucket menjadi 1.000 sehingga ukuran rata-rata bucket hash sekitar 500 MB. Untuk tabel yang sangat besar, ukuran bucket dapat melebihi 500 MB; rentang 2 GB hingga 3 GB per bucket masih sesuai.

  • 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 dari 2 (2n), seperti 512, 1024, 2048, atau 4096. Pendekatan ini memungkinkan sistem secara otomatis membagi atau menggabungkan bucket hash serta menghilangkan langkah shuffle dan sort, sehingga meningkatkan efisiensi eksekusi.

Tabel range-clustered

Parameter

Required

Description

Remarks

RANGE CLUSTERED BY

Yes

Menentukan kolom range-cluster.

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

SORTED BY

Yes

Menentukan urutan pengurutan kolom dalam setiap bucket.

Penggunaannya sama seperti pada tabel hash-clustered.

number_of_buckets

Yes

Menentukan jumlah bucket.

Untuk tabel range-clustered, praktik terbaik menggunakan pangkat dari 2 (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 group adalah kunci range clustering atau prefiksnya, redistribusi data (shuffle) dapat dihilangkan untuk meningkatkan performa. Fitur ini dapat diaktifkan atau dinonaktifkan dengan menjalankan perintah set odps.optimizer.enable.range.partial.repartitioning=true/false;. Secara default, fitur ini dinonaktifkan.

Catatan
  • Manfaat tabel terkluster:

    • Pemangkasan bucket yang dioptimalkan

    • Agregasi yang dioptimalkan

    • Penyimpanan yang dioptimalkan

  • Batasan tabel terkluster:

    • INSERT INTO tidak didukung. Data hanya dapat ditambahkan menggunakan INSERT OVERWRITE.

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

    • Fitur pencadangan dan pemulihan tidak didukung.

Parameter tabel eksternal

Parameter tabel eksternal

Bagian ini mencakup parameter tabel eksternal OSS. Jenis tabel eksternal lainnya didokumentasikan di Tabel eksternal.

Parameter

Required

Description

STORED AS '<file_format>'

Yes

Menentukan file_format berdasarkan format data tabel eksternal.

WITH SERDEPROPERTIES(options)

No

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

oss_location

Yes

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

Parameter Tabel Transaksional dan Tabel 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

Required

Description

Remarks

PRIMARY KEY(PK)

Yes

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

Sintaks mengikuti sintaks standard SQL untuk primary key. Kolom primary key harus diatur sebagai NOT NULL dan tidak dapat dimodifikasi. Setelah primary key ditetapkan, data akan dihapus duplikatnya berdasarkan kolom primary key. Batasan unik diberlakukan dalam satu partisi atau dalam tabel non-partisi.

transactional

Yes

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

No

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 memodifikasi parameter ini untuk tabel partisi, dan pengaturan baru berlaku untuk partisi baru. Anda tidak dapat memodifikasi 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 traffic 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 disarankan 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

No

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, error 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

No

Nilai default: false.

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

acid.write.precombine.field

No

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

No

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 dimodifikasi 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 error dilaporkan jika kondisi ini tidak terpenuhi.

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

  • Batasan lain:

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

    • Tabel standar tidak dapat dikonversi menjadi Tabel Delta.

    • Perubahan skema pada kolom primary key Tabel Delta tidak diperbolehkan.

Parameter Tabel Transaksional

Parameter

Required

Description

TBLPROPERTIES("transactional"="true")

Yes

Mengatur tabel sebagai Tabel Transaksional, yang mengaktifkan operasi update dan delete tingkat baris. Perbarui atau hapus data (UPDATE | DELETE).

Berikut batasan yang berlaku untuk Tabel Transaksional:

  • Properti transactional hanya dapat diatur saat pembuatan tabel. Properti ini tidak dapat dimodifikasi pada tabel yang sudah ada menggunakan ALTER TABLE. Pernyataan berikut akan mengembalikan error:

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

  • Konversi antara tabel internal standar, tabel eksternal, atau tabel terkluster dengan Tabel Transaksional tidak didukung.

  • Pemadatan otomatis tidak didukung. Lakukan pemadatan file secara manual seperti yang dijelaskan dalam 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, lakukan pencadangan manual ke tabel lain menggunakan pernyataan SELECT ... INSERT.

Buat tabel (dari yang sudah ada)

Buat tabel (dari yang sudah ada)

  • Gunakan pernyataan CREATE TABLE [IF NOT EXISTS] <table_name> [LIFECYCLE <days>] AS <select_statement>; untuk membuat tabel baru sekaligus menyalin data ke dalamnya.

    • 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 tabel baru. Pernyataan ini mendukung pembuatan tabel internal dan penyalinan data dari tabel eksternal.

  • Gunakan 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 ada.

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

    • Anda dapat menggunakan parameter lifecycle untuk menentukan siklus hidup tabel baru. Pernyataan ini juga mendukung pembuatan tabel internal dengan skema yang disalin 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 hash-clustered non-partisi.

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

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

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

    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 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 dengan menjalankan kueri terhadap tabel eksternal OSS dari MaxCompute menggunakan perintah 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 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 kolomnya. 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 seperti 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;

DROP TABLE

Hapus tabel non-partisi atau partisi.

Peringatan

  • Berhati-hatilah saat menghapus tabel. Tabel yang dihapus hanya dapat dipulihkan jika pencadangan dan pemulihan diaktifkan untuk Proyek dan tabel berada dalam periode retensi data. Pemulihan memerlukan konfigurasi cadangan lokal.

  • Menghapus tabel mengurangi penggunaan penyimpanan Proyek MaxCompute.

Sintaks

DROP TABLE [IF EXISTS] <table_name>; 

Parameter

Parameter

Required

Description

IF EXISTS

No

Tanpa IF EXISTS, mencoba menghapus tabel yang tidak ada menghasilkan exception. Dengan IF EXISTS, pernyataan berhasil meskipun tabel tidak ada.

table_name

Yes

Nama tabel yang akan dihapus.

Contoh

-- Hapus tabel sale_detail. Pernyataan berhasil terlepas dari apakah tabel ada atau tidak.
DROP TABLE IF EXISTS sale_detail; 

Referensi