All Products
Search
Document Center

MaxCompute:FAQ tentang operasi DML

Last Updated:Aug 22, 2026

Topik ini menjawab pertanyaan umum (FAQ) mengenai pelaksanaan operasi Data Manipulation Language (DML) pada tabel.

Category

FAQ

Insert or update data

Delete data

Jika terjadi error selama operasi INSERT, apakah data asli rusak?

Tidak, data asli tidak rusak. MaxCompute menjamin atomicity. Jika operasi INSERT berhasil, data diperbarui. Jika operasi gagal, data dikembalikan ke kondisi semula (rollback).

Apa yang harus saya lakukan jika muncul error Table xxx has n columns, but query has m columns saat menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE?

Saat memasukkan data menggunakan pernyataan INSERT INTO atau INSERT OVERWRITE, pastikan bidang-bidang dalam klausa SELECT sesuai dengan bidang-bidang di tabel tujuan dalam jumlah, urutan, dan tipe data. MaxCompute tidak mendukung pemasukan data hanya ke bidang tertentu sambil mengatur bidang lain menjadi NULL atau nilai default. Untuk mencapai hal tersebut, atur nilai tersebut sebagai NULL dalam klausa SELECT. Contohnya: select 'a', null, col_name from table_name;.

Apa yang harus saya lakukan jika muncul error "a single instance cannot output data to more than 10000 partitions" saat menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE?

  • Gejala

    Saat menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE, error berikut dikembalikan.

    FAILED: ODPS-0123031:Partition exception - a single instance cannot output data to more than 10000 partitions
  • Penyebab

    Tabel MaxCompute dapat memiliki hingga 60.000 partisi. Namun, satu job hanya dapat menulis data ke maksimal 10.000 partisi dalam satu tabel output. Error ini biasanya terjadi karena bidang partisi diatur secara salah. Misalnya, melakukan partisi berdasarkan bidang ID dapat menghasilkan terlalu banyak partisi.

  • Solusi

    Job yang menghasilkan beberapa ribu partisi dinamis dianggap besar. Jika suatu job menghasilkan lebih dari 10.000 partisi, hal ini mungkin menunjukkan adanya masalah pada logika bisnis atau sintaks SQL. Jika Anda memastikan bahwa logika dan sintaks sudah benar, Anda dapat mencegah error ini dengan mengubah bidang partisi pada tabel partisi atau membagi logika bisnis menjadi beberapa job.

Apa yang harus saya lakukan jika muncul error "invalid dynamic partition value" saat memasukkan data ke partisi dinamis tabel MaxCompute?

  • Gejala

    Saat memasukkan data ke partisi dinamis, error berikut dikembalikan.

    FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=Shanghai
  • Penyebab

    Error ini terjadi karena nilai yang digunakan untuk partisi dinamis tidak valid. Partisi dinamis membuat partisi berdasarkan bidang yang ditentukan. Nilai bidang partisi tersebut tidak boleh mengandung karakter khusus atau karakter Tionghoa.

  • Solusi

    Saat memasukkan data ke partisi dinamis, perhatikan hal-hal berikut:

    • Saat memasukkan data ke partisi dinamis di lingkungan terdistribusi, satu proses hanya dapat menghasilkan maksimal 512 partisi dinamis.

    • Pernyataan SQL partisi dinamis tidak boleh menghasilkan lebih dari 2.000 partisi dinamis.

    • Nilai partisi yang dihasilkan secara dinamis tidak boleh bernilai NULL.

    • Jika tabel tujuan memiliki beberapa level partisi, Anda dapat menentukan sebagian partisi sebagai statis saat menjalankan pernyataan INSERT. Namun, partisi statis tersebut harus merupakan partisi tingkat atas.

Apa yang harus saya lakukan jika muncul error saat memasukkan data FLOAT ke tabel MaxCompute?

Untuk informasi lebih lanjut mengenai tipe data dasar yang didukung oleh MaxCompute V2.0, lihat Data type versions. Tipe data FLOAT tidak memiliki definisi konstanta. Untuk memasukkan data FLOAT, gunakan fungsi CAST untuk mengonversi tipe data. Contohnya, cast(5.1 as float) mengonversi string '5.1' menjadi nilai FLOAT 5.1.

Saat menggunakan tipe data baru seperti TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP, atau BINARY dalam SQL MaxCompute, Anda harus mengaktifkannya dengan salah satu metode berikut:

  • Tingkat sesi: Tambahkan set odps.sql.type.system.odps2=true; sebelum pernyataan SQL dan kirimkan bersama-sama.

  • Tingkat proyek: Pemilik proyek menjalankan setproject odps.sql.type.system.odps2=true; untuk mengaktifkan tipe data baru untuk proyek tersebut.

Mengapa hasil operasi INSERT SELECT dan operasi SELECT berbeda untuk data yang sama?

  • Gejala

    Saat menjalankan pernyataan SQL pada bidang STRING yang sama, jumlah tempat desimal tidak konsisten. Operasi SELECT mempertahankan dua tempat desimal, sedangkan operasi INSERT SELECT menampilkan beberapa tempat desimal.

  • Penyebab

    Dalam operasi INSERT SELECT, saat bidang STRING dikonversi secara implisit ke tipe DECIMAL, nilainya terlebih dahulu dikonversi ke tipe DOUBLE sebelum operasi ROUND dilakukan. Karena tipe DOUBLE tidak presisi, hasil operasi ROUND mungkin tetap memiliki beberapa tempat desimal.

  • Solusi

    Gunakan konversi eksplisit. Gunakan fungsi `CAST` untuk mengonversi data secara eksplisit ke tipe `DECIMAL`.

    case when pcm.abc is null then 0 
                        else round(cast(pcm.abc as decimal) ,2) 
                    end abc                        

Jika tipe data suatu bidang di tabel tujuan adalah VARCHAR(10), apakah akan muncul error jika terjadi overflow data selama operasi insert?

Tidak. Saat memasukkan data ke bidang dengan tipe data VARCHAR(10), data akan dipotong (truncated) jika panjangnya melebihi batas.

Apa yang harus saya lakukan jika muncul error "Transaction timeout because cannot acquire exclusive lock" saat menjalankan pernyataan SQL MaxCompute?

  • Gejala

    Error berikut terjadi saat pernyataan SQL MaxCompute dieksekusi.

    Failed to run ddltask - Modify DDL meta encounter exception : ODPS-0121096:MetaStore transaction conflict - Reached maximum retry times because of OTSStorageTxnLockKeyFail(Inner exception: Transaction timeout because cannot acquire exclusive lock.) 
  • Penyebab

    MaxCompute memungkinkan beberapa job menulis data ke satu tabel secara konkuren. Saat beberapa job memasuki fase commit metadata secara bersamaan, setiap job harus mendapatkan kunci (lock) pada metadata tabel tersebut, menulis ke dalamnya, lalu melepaskan kunci tersebut. Jika banyak job mencoba hal ini secara simultan, metadata dapat tetap terkunci dalam periode yang lama. Hal ini dapat menyebabkan job lain mengalami timeout saat menunggu untuk mendapatkan kunci, sehingga muncul error cannot acquire exclusive lock. Suatu job akan timeout jika tidak dapat mendapatkan kunci dalam waktu sekitar 30 detik. Granularitas kunci berada pada level tabel.

  • Solusi

    Periksa apakah terdapat beberapa operasi baca dan tulis yang dilakukan pada tabel atau partisi tabel yang sama secara bersamaan. Hindari melakukan beberapa operasi baca dan tulis pada tabel atau partisi tabel secara simultan.

Bagaimana cara memperbarui data di tabel atau partisi MaxCompute?

MaxCompute mendukung pembaruan data tingkat baris pada tabel transaksional menggunakan operasi update.

Jika Anda menjalankan operasi update pada tabel non-transaksional, error trying to update a non-transactional table is not allowed. Set tblproperties ("transactional" = "true") to use this feature akan muncul.

Anda dapat mengimpor data dari partisi atau tabel sumber ke partisi atau tabel tujuan dan mengeksekusi operasi update selama proses impor. Tujuan juga dapat berupa sumber itu sendiri, yang dikenal sebagai pembaruan in-place (in-place update).

Catatan

Untuk informasi lebih lanjut mengenai cara membuat tabel transaksional, lihat Table operations. MaxCompute hanya memungkinkan Anda mengatur properti transaksional saat membuat tabel. Anda tidak dapat menggunakan alter table untuk mengubah properti transaksional pada tabel yang sudah ada.

Bagaimana cara menghapus data dari tabel atau partisi MaxCompute?

MaxCompute mendukung penghapusan data tingkat baris pada tabel transaksional menggunakan operasi delete.

Jika tabel bukan tabel transaksional, Anda dapat menghapus data dengan cara-cara berikut:

  • Hapus seluruh tabel dengan menjalankan perintah DROP.

  • Untuk tabel non-partisi, jalankan perintah truncate table table_name; untuk menghapus semua data dari tabel, atau gunakan perintah insert overwrite untuk mencapai hasil serupa.

    • Contoh 1: Hapus data di mana `Col=1` dari `TableA`.

      insert overwrite table TableA select a,b,c.... from TableA where Col <> 1;
    • Contoh 2: Hapus semua data.

      insert overwrite table TableA select a,b,c.... from TableA where 1=2;
  • Untuk tabel partisi, jalankan perintah alter table table_name drop if exists partition(partition_name='specific_partition_value') untuk menghapus partisi yang sesuai.

    Sebagai contoh, kolom kunci partisi tabel `testtable` adalah `ds`. Jalankan perintah berikut untuk menghapus partisi ds='20170520'.

    alter table testtable drop if exists partition (ds='20170520');
  • Gunakan pernyataan INSERT dengan klausa WHERE untuk mengimpor data yang diperlukan ke partisi atau tabel baru. Tabel sumber dan tabel tujuan untuk pernyataan INSERT dapat sama.

    insert overwrite table sale_detail select * from sale_detail where name='mengyonghui';

Jika tabel non-partisi berisi volume data yang besar, bagaimana cara menghapus data duplikat darinya?

Jika semua kolom pada baris duplikat identik, Anda dapat melakukan operasi GROUP BY pada semua kolom. Sebagai contoh, jika tabel non-partisi table1 memiliki kolom c1, c2, dan c3, Anda dapat menjalankan perintah berikut.

insert overwrite table table1 select c1, c2, c3 from table1 group by

 c1, c2, c3;
Catatan

Sebelum melakukan operasi ini, backup data Anda. Berdasarkan volume data, evaluasi apakah biaya metode ini lebih rendah dibandingkan biaya mengimpor ulang data.