CLONE TABLE menyalin data dari tabel sumber ke tabel tujuan. Gunakan perintah ini untuk melakukan migrasi data antar tabel dalam Proyek MaxCompute yang sama atau berbeda, selama berada dalam Wilayah dan kelas penyimpanan yang sama.
Batasan
Kompatibilitas skema: Skema tabel tujuan harus kompatibel dengan skema tabel sumber.
Batas penyalinan partisi:
Saat menyalin ke tabel tujuan yang sudah ada, maksimal 10.000 partisi dapat disalin sekaligus.
Jika tabel tujuan belum ada, tidak ada batas jumlah partisi, dan operasi tersebut bersifat atomik.
Jenis tabel yang didukung:
Tabel Delta PK/Append:
Tabel Delta yang sudah ada tidak dapat ditimpa. Anda hanya dapat menggunakan
CLONE TABLEuntuk membuat Tabel Delta baru.Tabel biasa (tabel partisi, tabel non-partisi, dan Tabel terkluster).
Tabel transaksional:
Tabel transaksional yang sudah ada tidak dapat ditimpa. Anda hanya dapat menggunakan
CLONE TABLEuntuk membuat tabel transaksional baru.
Tabel eksternal:
CLONE TABLEtidak dapat menyalin data dari tabel eksternal.Kontrol akses tingkat baris atau penyamaran data:
CLONE TABLEtidak dapat digunakan pada tabel yang memiliki Row Access Policy atau Data Masking Policy yang diterapkan.Cross-region:
CLONE TABLEtidak dapat menyalin data antar Proyek MaxCompute di Wilayah atau Kluster yang berbeda (termasuk selama migrasi O&M proyek).Cross-storage class:
CLONE TABLEtidak dapat menyalin data antar proyek yang menggunakan kelas penyimpanan berbeda (misalnya, dari proyek penyimpanan multi-AZ ke proyek penyimpanan single-AZ, atau sebaliknya).Untuk melakukan migrasi data antar proyek dengan kelas penyimpanan berbeda, gunakan alternatif berikut:
Tabel non-partisi: Gunakan
CREATE TABLE ASuntuk melakukan migrasi data.Tabel partisi: Gunakan
CREATE TABLE LIKEuntuk membuat tabel, lalu gunakanINSERT OVERWRITEuntuk melakukan migrasi data.
Evolusi skema:
CLONE TABLEtidak dapat digunakan pada tabel yang telah mengalami Schema Evolution (seperti penambahan atau penghapusan kolom).
Penagihan
Operasi CLONE TABLE bersifat berbasis metadata dan tidak dikenai biaya komputasi. Tabel hasil kloning akan ditagih berdasarkan Penggunaan penyimpanan aktualnya.
Sintaks
CLONE TABLE [<src_project_name>.]<src_table_name> [PARTITION (<pt_spec>), ...]
TO [<dest_project_name>.]<dest_table_name> [IF EXISTS [OVERWRITE | IGNORE]];Parameter:
Parameter | Wajib | Deskripsi |
| Tidak | Proyek MaxCompute yang berisi tabel sumber. Nilai default adalah proyek saat ini. Wajib ditentukan jika tabel sumber dan tujuan berada di proyek berbeda. |
| Ya | Nama tabel sumber. |
| Tidak | Partisi yang akan disalin. Format: |
| Tidak | Proyek MaxCompute yang berisi tabel tujuan. Nilai default adalah proyek saat ini. Wajib ditentukan jika tabel sumber dan tujuan berada di proyek berbeda. |
| Ya | Nama tabel tujuan. Lihat tabel perilaku di bawah ini. |
Perilaku tabel tujuan:
Kondisi | Perilaku |
Tabel tujuan tidak ada | Membuat tabel menggunakan semantik |
Tabel tujuan ada + | Menimpa data di tabel tujuan atau partisi yang ditentukan. |
Tabel tujuan ada + | Melewati partisi yang sudah ada tanpa menimpa datanya. |
Data contoh
Contoh berikut menggunakan dua tabel sampel. Jalankan perintah di bawah ini untuk membuat dan mengisi datanya.
Tabel partisi: `sale_detail`
Buat tabel partisi.
-- Buat tabel partisi CREATE TABLE IF NOT EXISTS sale_detail ( shop_name STRING, customer_id STRING, total_price DOUBLE ) PARTITIONED BY (sale_date STRING, region STRING); -- Tambahkan partisi ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china') PARTITION (sale_date='2014', region='shanghai'); -- Masukkan data INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3); INSERT INTO sale_detail PARTITION (sale_date='2014', region='shanghai') VALUES ('null','c5',null),('s6','c6',100.4),('s7','c7',100.5);Kueri tabel untuk verifikasi:
SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail;
Tabel non-partisi: `sale_detail_np`
Buat tabel non-partisi.
-- Buat tabel non-partisi CREATE TABLE IF NOT EXISTS sale_detail_np ( shop_name STRING, customer_id STRING, total_price DOUBLE ); -- Masukkan data INSERT INTO sale_detail_np VALUES ('s4','c4',100.4);Kueri tabel untuk verifikasi:
SELECT * FROM sale_detail_np;
Contoh
Contoh 1:Menyalin tabel non-partisi ke tabel baru
CLONE TABLE sale_detail_np TO sale_detail_np_clone; -- Membuat sale_detail_np_clone dan menyalin semua data
SELECT * FROM sale_detail_np_clone;Output yang diharapkan:
+------------+-------------+-------------+
| shop_name | customer_id | total_price |
+------------+-------------+-------------+
| s4 | c4 | 100.4 |
+------------+-------------+-------------+Contoh 2:Menyalin partisi tertentu ke tabel yang sudah ada
CLONE TABLE sale_detail PARTITION (sale_date='2013', region='china')
TO sale_detail_clone IF EXISTS OVERWRITE; -- Hanya menyalin partisi 2013/china; menimpa jika partisi tersebut sudah ada
SELECT * FROM sale_detail_clone;Output yang diharapkan:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
+------------+-------------+-------------+------------+------------+Contoh 3:Menyalin semua partisi sambil melewati partisi yang sudah ada
Contoh ini melanjutkan dari contoh sebelumnya. sale_detail_clone sudah berisi partisi 2013/china. Opsi IF EXISTS IGNORE menyalin partisi lainnya tanpa menyentuh partisi yang sudah ada.
CLONE TABLE sale_detail TO sale_detail_clone IF EXISTS IGNORE; -- Menambahkan partisi baru; melewati partisi yang sudah ada
SELECT * FROM sale_detail_clone;Output yang diharapkan:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
| null | c5 | NULL | 2014 | shanghai |
| s6 | c6 | 100.4 | 2014 | shanghai |
| s7 | c7 | 100.5 | 2014 | shanghai |
+------------+-------------+-------------+------------+------------+Contoh 4:Menyalin semua partisi ke tabel baru
CLONE TABLE sale_detail TO sale_detail_clone1; -- Membuat sale_detail_clone1 dan menyalin semua partisi secara atomik
SELECT * FROM sale_detail_clone1;Output yang diharapkan:
+------------+-------------+-------------+------------+------------+
| shop_name | customer_id | total_price | sale_date | region |
+------------+-------------+-------------+------------+------------+
| s1 | c1 | 100.1 | 2013 | china |
| s2 | c2 | 100.2 | 2013 | china |
| s3 | c3 | 100.3 | 2013 | china |
| null | c5 | NULL | 2014 | shanghai |
| s6 | c6 | 100.4 | 2014 | shanghai |
| s7 | c7 | 100.5 | 2014 | shanghai |
+------------+-------------+-------------+------------+------------+Contoh 5:Mengkloning Tabel Delta
Mengkloning Tabel Delta non-partisi
-- Buat Tabel Delta non-partisi CREATE TABLE IF NOT EXISTS sale_detail_delta ( shop_name STRING, customer_id STRING, total_price DOUBLE ) TBLPROPERTIES ("table.format.version"="2"); INSERT INTO sale_detail_delta VALUES ('s1','c1',100.1),('s2','c2',100.2); -- Contoh kloning CLONE TABLE sale_detail_delta TO sale_detail_delta_clone;Mengkloning Tabel Delta partisi
-- Buat Tabel Delta partisi CREATE TABLE IF NOT EXISTS sale_detail_delta_pt ( shop_name STRING, customer_id STRING, total_price DOUBLE ) PARTITIONED BY (dd STRING, hh STRING) TBLPROPERTIES ("table.format.version"="2"); INSERT INTO sale_detail_delta_pt PARTITION (dd='01', hh='01') VALUES ('s3','c3',100.3); -- Contoh kloning CLONE TABLE sale_detail_delta_pt PARTITION (dd='01', hh='01') TO sale_detail_delta_pt_clone;
Praktik terbaik
Untuk informasi mengenai migrasi data antar proyek MaxCompute dalam wilayah yang sama, lihat 使用CLONE TABLE实现同地域MaxCompute跨项目数据迁移.