MaxCompute mendukung penambahan, penghapusan, penggantian nama, pengubahan urutan, serta modifikasi kolom pada tabel yang sudah ada.
Ikhtisar operasi
| Operasi | Evolusi skema diperlukan | Deskripsi |
|---|---|---|
| Tambah kolom atau komentar | Ya | Menambahkan kolom ke tabel yang sudah ada |
| Hapus kolom | Ya | Menghapus satu atau beberapa kolom dari tabel |
| Ubah tipe data kolom | Ya | Mengonversi kolom ke tipe data yang berbeda |
| Ubah urutan kolom | Ya | Memindahkan kolom ke posisi yang berbeda |
| Ubah nama kolom | Tidak | Mengganti nama kolom |
| Ubah komentar kolom | Tidak | Memperbarui komentar pada kolom |
| Ubah nama dan komentar kolom | Tidak | Mengganti nama kolom dan memperbarui komentarnya secara bersamaan |
| Ubah properti NOT NULL kolom | Tidak | Mengizinkan nilai NULL untuk kolom kunci non-partisi |
Platform yang didukung
Jalankan perintah operasi kolom di salah satu platform berikut:
Prasyarat
Sebelum memulai, pastikan Anda memiliki:
Ubah izin pada tabel target.
Schema evolution diaktifkan di tingkat proyek (hanya diperlukan untuk menambah kolom, menghapus kolom, mengubah tipe data kolom, dan mengubah urutan kolom).
Aktifkan schema evolution
Jalankan perintah berikut untuk mengaktifkan schema evolution:
setproject odps.schema.evolution.enable=true;Hanya pemilik proyek atau pengguna dengan role Super_Administrator atau Admin yang dapat mengatur parameter ini. Perubahan akan berlaku sekitar 10 menit setelah diatur. Untuk informasi selengkapnya, lihat Assign built-in management roles to a user.
Tambah kolom atau komentar
Tambahkan kolom ke tabel non-partisi atau partisi yang sudah ada. Kolom baru ditambahkan di akhir tabel. MaxCompute mendukung tipe data kompleks seperti STRUCT<x: STRING, y: BIGINT> dan MAP<STRING, STRUCT<x: DOUBLE, y: DOUBLE>>.
Sintaks
ALTER TABLE <table_name>
ADD COLUMNS [IF NOT EXISTS]
(<col_name1> <type1> COMMENT ['<col_comment>']
[, <col_name2> <type2> COMMENT '<col_comment>'...]
);Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel. Kolom baru ditambahkan di akhir; urutan tidak dapat ditentukan. |
| col_name | Ya | Nama kolom baru. |
| type | Ya | Tipe data kolom baru. |
| col_comment | Tidak | Komentar untuk kolom baru. |
Contoh
Tambahkan dua kolom ke tabel sale_detail:
ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(customer_name STRING, education BIGINT);Tambahkan dua kolom dengan komentar ke tabel sale_detail:
ALTER TABLE sale_detail ADD COLUMNS (customer_name STRING COMMENT 'Customer', education BIGINT COMMENT 'Education' );Tambahkan kolom bertipe data kompleks ke tabel sale_detail:
ALTER TABLE sale_detail ADD COLUMNS (region_info struct<province:string, area:string>);Jika kolom sudah ada dan pernyataan mencakup IF NOT EXISTS, pernyataan berhasil tetapi kolom tidak ditambahkan lagi:
-- Pernyataan berhasil, tetapi kolom ID tidak ditambahkan berulang.
ALTER TABLE sale_detail ADD COLUMNS IF NOT EXISTS(id bigint);Tambahkan kolom ke tabel Delta:
CREATE TABLE delta_table_test (pk BIGINT NOT NULL PRIMARY KEY, val BIGINT)
TBLPROPERTIES ("transactional"="true");
ALTER TABLE delta_table_test ADD COLUMNS (val2 bigint);Hapus kolom
Hapus satu atau beberapa kolom dari tabel non-partisi atau partisi yang sudah ada. Masukkan yes untuk mengonfirmasi penghapusan saat diminta.
Sintaks
-- Hapus satu kolom.
ALTER TABLE <table_name> DROP COLUMN <col_name>;
-- Hapus beberapa kolom.
ALTER TABLE <table_name> DROP COLUMNS <col_name1>[, <col_name2>...];Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel tempat kolom akan dihapus. |
| col_name | Ya | Nama kolom yang akan dihapus. |
Contoh
Hapus kolom customer_id dari tabel sale_detail:
-- Hapus kolom customer_id dari tabel sale_detail. Masukkan yes untuk mengonfirmasi penghapusan.
ALTER TABLE sale_detail DROP COLUMN customer_id;Hapus kolom customer_id menggunakan DROP COLUMNS:
-- Hapus kolom customer_id dari tabel sale_detail. Masukkan yes untuk mengonfirmasi penghapusan.
ALTER TABLE sale_detail DROP COLUMNS customer_id;Hapus kolom shop_name dan customer_id dari tabel sale_detail:
-- Hapus kolom shop_name dan customer_id dari tabel sale_detail. Masukkan yes untuk mengonfirmasi penghapusan.
ALTER TABLE sale_detail DROP COLUMNS shop_name, customer_id;Ubah tipe data kolom
Ubah tipe data kolom yang sudah ada.
Sintaks
ALTER TABLE <table_name> CHANGE [COLUMN] <old_column_name> <new_column_name> <new_data_type>;Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel yang berisi kolom tersebut. |
| old_column_name | Ya | Nama saat ini dari kolom tersebut. |
| new_column_name | Ya | Nama kolom setelah perubahan. Atur nilai ini sama dengan old_column_name untuk mempertahankan nama yang sama. Nilai ini tidak boleh sama dengan nama kolom lain yang sudah ada. |
| new_data_type | Ya | Tipe data baru kolom tersebut. |
Contoh
Ubah tipe data bidang id di tabel sale_detail dari BIGINT menjadi STRING:
ALTER TABLE sale_detail CHANGE COLUMN id id STRING;Tabel konversi tipe data
Y menunjukkan bahwa konversi didukung. N menunjukkan bahwa konversi tidak didukung. – menunjukkan bahwa konversi tidak berlaku. Y() menunjukkan bahwa konversi didukung jika kondisi dalam tanda kurung terpenuhi.

Ubah urutan kolom
Pindahkan kolom ke posisi berbeda dalam tabel non-partisi atau partisi yang sudah ada. Secara opsional, ganti nama kolom tersebut sekaligus.
Sintaks
ALTER TABLE <table_name> CHANGE <old_column_name> <new_column_name> <column_type> AFTER <column_name>;Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel. |
| old_column_name | Ya | Nama saat ini dari kolom yang akan dipindahkan. |
| new_col_name | Ya | Nama baru kolom tersebut. Atur nilai ini sama dengan old_column_name untuk mempertahankan nama yang sama. Nilai ini tidak boleh sama dengan nama kolom lain yang sudah ada. |
| column_type | Ya | Tipe data asli kolom tersebut. Ini tidak dapat diubah. |
| column_name | Ya | Kolom setelah mana kolom yang dipindahkan akan ditempatkan. |
Contoh
Ganti nama kolom customer menjadi customer_id dan pindahkan setelah kolom total_price:
ALTER TABLE sale_detail CHANGE customer customer_id STRING AFTER total_price;Pindahkan kolom customer_id setelah kolom total_price tanpa mengganti namanya:
ALTER TABLE sale_detail CHANGE customer_id customer_id STRING AFTER total_price;Ubah nama kolom
Ganti nama kolom dalam tabel non-partisi atau partisi yang sudah ada.
Sintaks
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> RENAME TO <new_col_name>;Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel. |
| old_col_name | Ya | Nama kolom yang akan diganti. Kolom tersebut harus ada. |
| new_col_name | Ya | Nama baru untuk kolom tersebut. Nama harus unik. |
Contoh
Ganti nama kolom customer_name menjadi customer di tabel sale_detail:
ALTER TABLE sale_detail CHANGE COLUMN customer_name RENAME TO customer;Ubah komentar kolom
Perbarui komentar kolom dalam tabel non-partisi atau partisi yang sudah ada.
Sintaks
ALTER TABLE <table_name> CHANGE COLUMN <col_name> COMMENT '<col_comment>';Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel. |
| col_name | Ya | Nama kolom. Kolom tersebut harus ada. |
| col_comment | Ya | Komentar baru. Komentar harus berupa string valid dengan panjang maksimal 1024 byte. |
Contoh
Ubah komentar kolom customer di tabel sale_detail0113:
ALTER TABLE sale_detail0113 CHANGE COLUMN customer COMMENT 'customer';Ubah nama dan komentar kolom
Ganti nama kolom dan perbarui komentarnya secara bersamaan dalam tabel non-partisi atau partisi.
Sintaks
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> <new_col_name> <column_type> COMMENT '<col_comment>';Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel. |
| old_col_name | Ya | Nama kolom yang akan diubah. Kolom tersebut harus ada. |
| new_col_name | Ya | Nama baru untuk kolom tersebut. Nama harus unik. |
| column_type | Ya | Tipe data kolom tersebut. |
| col_comment | Opsional | Komentar baru. Isinya dapat mencapai panjang 1024 byte. |
Contoh
Ganti nama kolom customer menjadi customer_newname dan atur komentarnya menjadi 'customer':
ALTER TABLE sale_detail CHANGE COLUMN customer customer_newname STRING COMMENT 'customer';Ubah properti NOT NULL kolom
Izinkan nilai NULL untuk kolom kunci non-partisi. Operasi ini tidak dapat dikembalikan. Setelah nilai NULL diizinkan, kolom tidak dapat dikembalikan ke status NOT NULL.
Untuk memeriksa apakah kolom mengizinkan nilai NULL, jalankan DESC EXTENDED table_name; dan periksa bidang Nullable:
true— Nilai NULL diizinkan.false— Nilai NULL tidak diizinkan.
Sintaks
ALTER TABLE <table_name> CHANGE COLUMN <old_col_name> NULL;Parameter
| Parameter | Wajib | Deskripsi |
|---|---|---|
| table_name | Ya | Nama tabel. |
| old_col_name | Ya | Nama kolom kunci non-partisi yang akan diubah. Kolom tersebut harus ada. |
Contoh
Buat tabel partisi dengan kendala NOT NULL pada kolom id, lalu izinkan nilai NULL:
-- Buat tabel partisi di mana kolom id tidak boleh NULL.
CREATE TABLE null_test(id INT NOT NULL, name STRING) PARTITIONED BY (ds string);
-- Lihat properti tabel.
DESC EXTENDED null_test;
-- Hasil berikut dikembalikan:
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment |
+------------------------------------------------------------------------------------+
| id | int | | | false | NULL | |
| name | string | | | true | NULL | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| ds | string | |
+------------------------------------------------------------------------------------+
-- Izinkan kolom id bernilai NULL.
ALTER TABLE null_test CHANGE COLUMN id NULL;
-- Lihat properti tabel.
DESC EXTENDED null_test;
-- Hasil berikut dikembalikan:
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment |
+------------------------------------------------------------------------------------+
| id | int | | | true | NULL | |
| name | string | | | true | NULL | |
+------------------------------------------------------------------------------------+
| Partition Columns: |
+------------------------------------------------------------------------------------+
| ds | string | |
+------------------------------------------------------------------------------------+Batasan schema evolution
Ketika operasi schema evolution (mengubah urutan kolom, menambah dan mengatur ulang kolom, atau menghapus kolom) memodifikasi tabel, perilaku baca dan tulis berubah untuk jenis pekerjaan tertentu.
| Jenis pekerjaan | Baca | Tulis |
|---|---|---|
| MapReduce 1.0 / Tugas Graph | Tidak didukung | Tidak didukung |
| CUPID Spark (Spark-2.3.0-odps0.34.0 atau Spark-3.1.1-odps0.34.0) | Didukung | Tidak didukung |
| Pekerjaan PAI | Didukung | Tidak didukung |
| Hologres (versi sebelum 1.3, tabel eksternal) | Tidak didukung | Tidak didukung |
Batasan tambahan:
CLONE TABLE tidak didukung setelah schema evolution terjadi.
Streaming Tunnel melaporkan error setelah schema evolution terjadi.