全部产品
Search
文档中心

MaxCompute:Menyisipkan atau menimpa data ke dalam partisi dinamis (DYNAMIC PARTITION)

更新时间:Jul 06, 2025

MaxCompute memungkinkan Anda menyisipkan data ke dalam partisi dinamis menggunakan INSERT INTO atau INSERT OVERWRITE.

Anda dapat menjalankan pernyataan berikut pada platform berikut:

Prasyarat

Sebelum menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE, pastikan Anda memiliki izin Update pada tabel tujuan dan izin Select pada metadata dari tabel sumber. Untuk informasi lebih lanjut, lihat Izin MaxCompute.

Deskripsi Fitur

Saat menggunakan MaxCompute SQL untuk memproses data, Anda hanya perlu menentukan nama kolom kunci partisi di INSERT INTO atau INSERT OVERWRITE, bukan nilai kolom kunci partisi. Setelah menentukan nilai kolom kunci partisi di SELECT, MaxCompute secara otomatis menyisipkan data ke dalam partisi tujuan berdasarkan nilai tersebut.

Untuk informasi lebih lanjut tentang cara menyisipkan data ke dalam partisi statis, lihat Menyisipkan atau Memperbarui Data ke dalam Tabel atau Partisi Statis (INSERT INTO dan INSERT OVERWRITE).

Batasan

Jika menyisipkan data ke dalam partisi dinamis menggunakan INSERT INTO atau INSERT OVERWRITE, perhatikan batasan berikut:

  • Maksimum 10.000 partisi dinamis dapat dibuat setelah INSERT INTO dijalankan. Maksimum 60.000 partisi dinamis dapat dibuat setelah INSERT OVERWRITE dijalankan.

  • Dalam lingkungan terdistribusi, pernyataan SQL yang digunakan untuk menyisipkan atau memperbarui data ke dalam partisi dinamis dapat menghasilkan maksimum 512 partisi dinamis. Jika jumlah partisi dinamis melebihi batas ini, pengecualian akan terjadi.

  • Nilai partisi dinamis tidak boleh NULL dan tidak boleh mengandung karakter khusus. Jika tidak, kesalahan berikut akan dilaporkan: FAILED: ODPS-0123031: Partition exception - invalid dynamic partition value: province=xxx.

    Catatan

    Nilai kolom kunci partisi tidak boleh mengandung karakter dua-byte, seperti karakter Cina. Nilai kolom kunci partisi harus dimulai dengan huruf dan dapat mengandung huruf, angka, serta karakter khusus yang didukung. Panjangnya harus antara 1 hingga 255 byte. Karakter khusus berikut didukung: spasi, titik dua (:), garis bawah (_), tanda dolar ($), tanda pagar (#), titik (.), tanda seru (!), dan simbol at (@). Perilaku karakter lainnya tidak ditentukan, seperti karakter escape \t, \n, dan /.

  • Tabel terkluster tidak mendukung partisi dinamis.

Peringatan

Jika ingin memperbarui data tabel ke dalam partisi dinamis, perhatikan poin-poin berikut:

  • Jika menggunakan INSERT INTO PARTITION untuk partisi yang tidak ada, MaxCompute secara otomatis membuat partisi.

  • Jika menjalankan beberapa pekerjaan secara bersamaan untuk INSERT INTO PARTITION yang tidak ada, MaxCompute hanya membuat satu partisi untuk pekerjaan pertama yang berhasil dieksekusi.

  • Jika tidak dapat mengontrol konkurensi pekerjaan dari INSERT INTO PARTITION, disarankan untuk menjalankan perintah ALTER TABLE untuk membuat partisi terlebih dahulu. Untuk informasi lebih lanjut, lihat Operasi Partisi.

  • Jika tabel tujuan memiliki beberapa tingkat partisi, Anda dapat menentukan beberapa partisi sebagai partisi statis dalam pernyataan INSERT. Namun, partisi statis harus merupakan partisi tingkat tinggi.

  • Untuk menyisipkan data ke dalam partisi dinamis, Anda harus menentukan kolom kunci partisi di SELECT. Jika tidak, data akan gagal disisipkan.

Sintaks

INSERT {INTO|OVERWRITE} TABLE <table_name> PARTITION (<ptcol_name>[, <ptcol_name> ...]) 
<select_statement> FROM <from_statement>;

Parameter

Parameter

Wajib

Deskripsi

table_name

Ya

Nama tabel tujuan ke dalam mana Anda ingin menyisipkan data.

ptcol_name

Ya

Nama kolom kunci partisi di tabel tujuan.

select_statement

Ya

Klausa SELECT yang digunakan untuk menanyakan data yang ingin Anda sisipkan ke dalam tabel tujuan dari tabel sumber.

Jika tabel tujuan hanya memiliki partisi dinamis level-1, nilai bidang terakhir di SELECT menunjukkan nilai partisi dinamis di tabel tujuan. Pemetaan antara nilai kolom di tabel sumber di SELECT dan nilai kolom di tabel tujuan ditentukan oleh urutan kolom, bukan nama kolom. Jika urutan kolom di tabel sumber berbeda dari urutan di tabel tujuan, kami sarankan Anda menentukan kolom di select_statement berdasarkan urutan kolom di tabel tujuan.

from_statement

Ya

Klausa FROM. Klausa ini menentukan sumber data, seperti nama tabel sumber.

Data sampel

--Buat tabel partisi sale_detail.
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 ke tabel src. Operasi ini opsional. Jika Anda tidak membuat partisi terlebih dahulu, partisi akan dibuat secara otomatis ketika Anda menulis data ke tabel.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china');

--Tambahkan data ke tabel src. Bentuk singkat dari INSERT INTO TABLE table_name adalah INSERT INTO table_name. Kata kunci TABLE dalam INSERT OVERWRITE TABLE table_name tidak dapat dihilangkan.
INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);

--Aktifkan pemindaian tabel lengkap hanya untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data di tabel sale_detail.
SET odps.sql.allow.fullscan=true; 
SELECT * FROM sale_detail;

--Hasil yang dikembalikan.
+------------+-------------+-------------+------------+------------+
| 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

Contoh berikut menggunakan data dari tabel sale_detail, seperti yang ditunjukkan di Data Sampel.

  • Contoh 1: Menyisipkan data dari tabel sumber ke tabel tujuan. Anda dapat memperoleh partisi yang dihasilkan berdasarkan kolom region setelah pernyataan dijalankan. Pernyataan berikut menunjukkan contohnya:

    --Buat tabel tujuan total_revenues.
    CREATE TABLE total_revenues (revenue DOUBLE) PARTITIONED BY (region string);
    
    --Sisipkan data dari tabel sale_detail ke tabel total_revenues.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE total_revenues PARTITION(region) SELECT total_price AS revenue, region FROM sale_detail;
    
    --Jalankan pernyataan SHOW PARTITIONS untuk melihat partisi tabel total_revenues.
    SHOW PARTITIONS total_revenues;
       
    --Hasil yang dikembalikan.
    region=china  
    
    --Aktifkan pemindaian tabel lengkap hanya untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data di tabel total_revenues.  
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM total_revenues;    
    
    --Hasil yang dikembalikan.
    +------------+------------+
    | revenue    | region     |
    +------------+------------+
    | 100.1      | china      |
    | 100.2      | china      |
    | 100.3      | china      |
    +------------+------------+        
  • Contoh 2: Menyisipkan data dari tabel sumber ke tabel tujuan. Jika tabel tujuan memiliki beberapa tingkat partisi, partisi level-1 sale_date harus ditentukan. Pernyataan berikut menunjukkan contohnya:

    --Buat tabel tujuan sale_detail_dypart. 
    CREATE TABLE sale_detail_dypart LIKE sale_detail; 
    
    --Tentukan partisi level-1 dan sisipkan data ke tabel tujuan.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date='2013', region)
    SELECT shop_name,customer_id,total_price,region FROM sale_detail;
    
    --Aktifkan pemindaian tabel lengkap hanya untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data di tabel sale_detail_dypart.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    --Hasil yang dikembalikan.
    +------------+-------------+-------------+------------+------------+
    | 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: Pemetaan antara kolom di select_statement dan kolom di partisi dinamis tabel tujuan ditentukan oleh urutan kolom, bukan nama kolom. Pernyataan berikut menunjukkan contohnya:

    --Sisipkan data dari tabel sale_detail ke tabel sale_detail_dypart.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region)
    SELECT shop_name,customer_id,total_price,sale_date,region FROM sale_detail;
    
    --Aktifkan pemindaian tabel lengkap hanya untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data di tabel sale_detail_dypart.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    --Hasil yang dikembalikan. Kolom sale_date di partisi dinamis tabel sale_detail_dypart ditentukan oleh kolom sale_date di tabel sale_detail. Kolom region di partisi dinamis tabel sale_detail_dypart ditentukan oleh kolom region di tabel sale_detail.
    +------------+-------------+-------------+------------+------------+
    | 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      |
    +------------+-------------+-------------+------------+------------+
    
    
    --Sisipkan data dari tabel sale_detail ke tabel sale_detail_dypart dan ubah urutan kolom di select_statement.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region)
    SELECT shop_name,customer_id,total_price,region,sale_date FROM sale_detail;
    
    --Aktifkan pemindaian tabel lengkap hanya untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data di tabel sale_detail_dypart.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    --Hasil yang dikembalikan. Kolom sale_date di partisi dinamis tabel sale_detail_dypart ditentukan oleh kolom region di tabel sale_detail. Kolom region di partisi dinamis tabel sale_detail_dypart ditentukan oleh kolom sale_date di tabel sale_detail.
    +------------+-------------+-------------+------------+------------+
    | shop_name  | customer_id | total_price | sale_date  | region     |
    +------------+-------------+-------------+------------+------------+
    | s1         | c1          | 100.1       | china      | 2013       |
    | s2         | c2          | 100.2       | china      | 2013       |
    | s3         | c3          | 100.3       | china      | 2013       |
    | s1         | c1          | 100.1       | 2013       | china      |
    | s2         | c2          | 100.2       | 2013       | china      |
    | s3         | c3          | 100.3       | 2013       | china      |
    +------------+-------------+-------------+------------+------------+
  • Contoh 4 (Contoh Salah): Jika menyisipkan data ke dalam partisi dinamis, Anda harus menentukan kolom di partisi dinamis di SELECT. Jika tidak, data akan gagal disisipkan. Contoh pernyataan penggunaan salah:

    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date='2013', region) 
    SELECT shop_name,customer_id,total_price FROM sale_detail;

    Hasil yang dikembalikan:

    FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 3 in data source, requires 4 columns (includes dynamic partitions if any)
  • Contoh 5 (Contoh Salah): Jika hanya menentukan sub-partisi tingkat rendah saat menyisipkan data ke partisi dinamis, Anda mungkin gagal menyisipkan data ke partisi tingkat tinggi. Contoh pernyataan penggunaan salah:

    INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region='china')
    SELECT shop_name,customer_id,total_price,sale_date FROM sale_detail_dypart;

    Hasil yang dikembalikan:

    FAILED: ODPS-0130071:[1,72] Semantic analysis exception - static partition region must be a high level partition than any dynamic partitions
  • Contoh 6: Jika tipe data kolom kunci partisi tidak persis cocok dengan tipe data kolom di SELECT, konversi implisit dilakukan saat MaxCompute menyisipkan data ke partisi dinamis. Pernyataan berikut menunjukkan contohnya:

    --Buat tabel sumber src.
    CREATE TABLE src (c INT, d STRING) PARTITIONED BY (e INT);
    
    --Tambahkan partisi ke tabel src.
    ALTER TABLE src ADD IF NOT EXISTS PARTITION (e=201312);
    
    --Tambahkan data ke tabel src.
    INSERT INTO src PARTITION (e=201312) VALUES (1,100.1),(2,100.2),(3,100.3);
    
    --Buat tabel tujuan parttable.
    CREATE TABLE parttable(a INT, b DOUBLE) PARTITIONED BY (p STRING);
    
    --Sisipkan data dari tabel src ke tabel parttable.
    SET odps.sql.allow.fullscan=true; 
    INSERT INTO parttable PARTITION (p) SELECT c, d, CURRENT_TIMESTAMP() FROM src;
    
    --Tanyakan data di tabel parttable.
    SET odps.sql.allow.fullscan=true;
    SELECT * FROM parttable;
    
    --Hasil yang dikembalikan adalah sebagai berikut.
    +------------+------------+------------+
    | a          | b          | p          |
    +------------+------------+------------+
    | 1          | 100.1      | 2024-12-10 15:59:34.492 |
    | 2          | 100.2      | 2024-12-10 15:59:34.492 |
    | 3          | 100.3      | 2024-12-10 15:59:34.492 |
    +------------+------------+------------+
    Catatan

    Jika data Anda terurut, data tersebut tersebar secara acak saat disisipkan ke partisi dinamis. Ini mengurangi rasio kompresi data. Dalam hal ini, kami sarankan menggunakan Perintah Tunnel untuk mengunggah data ke partisi dinamis guna meningkatkan rasio kompresi data. Untuk informasi lebih lanjut tentang cara menggunakan perintah Tunnel, lihat Migrasi Data dari ApsaraDB RDS ke MaxCompute Berdasarkan Partisi Dinamis.