全部产品
Search
文档中心

:FAQ tentang Operasi DML

更新时间:Jul 02, 2025

Topik ini menjawab beberapa pertanyaan umum terkait operasi DML pada tabel di MaxCompute.

Kategori

FAQ

Penyisipan atau pembaruan data

Penghapusan data

Apakah data asli rusak jika terjadi kesalahan selama operasi INSERT?

Tidak, data asli tidak rusak. MaxCompute bersifat atomik. Jika operasi INSERT berhasil, data diperbarui. Jika gagal, data dikembalikan ke kondisi semula.

Apa yang harus saya lakukan jika pesan kesalahan Tabel xxx memiliki n kolom, tetapi query memiliki m kolom muncul saat saya menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE?

Saat menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE untuk menyisipkan data, pastikan urutan bidang, tipe bidang, dan jumlah total bidang dalam hasil pernyataan SELECT sesuai dengan tabel tujuan. MaxCompute tidak mengizinkan penentuan bidang dalam pernyataan INSERT. Jika ingin menyisipkan nilai null atau nilai default lainnya ke beberapa kolom, tentukan nilai tersebut dalam pernyataan SELECT. Contohnya: select 'a', null, col_name from table_name; digunakan bersama pernyataan INSERT untuk menyisipkan nilai a dan null ke dua kolom pertama serta nilai dari kolom col_name ke kolom ketiga.

Apa yang harus saya lakukan jika pesan kesalahan "sebuah instance tunggal tidak dapat mengeluarkan data ke lebih dari 10000 partisi" muncul saat saya menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE?

  • Deskripsi Masalah

    Saat menjalankan pernyataan INSERT INTO atau INSERT OVERWRITE, muncul pesan kesalahan berikut:

    GAGAL: ODPS-0123031:Pengecualian partisi - sebuah instance tunggal tidak dapat mengeluarkan data ke lebih dari 10000 partisi
  • Penyebab

    Tabel MaxCompute dapat berisi maksimal 60.000 partisi. Namun, hanya 10.000 partisi yang diizinkan dalam tabel keluaran untuk pekerjaan. Kesalahan ini sering disebabkan oleh konfigurasi salah pada bidang partisi, misalnya pembagian berdasarkan ID yang menghasilkan partisi berlebihan.

  • Solusi

    Jumlah partisi besar sering kali terjadi jika tabel keluaran pekerjaan berisi ribuan partisi dinamis. Jika jumlah partisi melebihi 10.000, kemungkinan ada kesalahan logika bisnis atau sintaks SQL. Jika tidak ada kesalahan logika atau sintaks, modifikasi bidang partisi tabel yang dipartisi atau bagi logika bisnis menjadi beberapa pekerjaan untuk menghindari kesalahan ini.

Apa yang harus saya lakukan jika pesan kesalahan "nilai partisi dinamis tidak valid" muncul saat saya menyisipkan partisi dinamis ke dalam tabel MaxCompute?

  • Deskripsi Masalah

    Saat menyisipkan partisi dinamis ke dalam tabel MaxCompute, muncul pesan kesalahan berikut:

    GAGAL: ODPS-0123031:Pengecualian partisi - nilai partisi dinamis tidak valid: province=上海
  • Penyebab

    Partisi dinamis tidak valid karena menggunakan bidang yang mengandung karakter khusus atau karakter Cina sebagai bidang partisi dinamis.

  • Solusi

    Sebelum menyisipkan partisi dinamis ke dalam tabel MaxCompute, perhatikan aturan berikut:

    • Dalam lingkungan terdistribusi, maksimal 512 partisi dinamis dapat ada dalam satu proses.

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

    • Nilai partisi yang dihasilkan secara dinamis tidak boleh NULL.

    • Jika tabel tujuan berisi partisi multi-level, beberapa partisi dapat ditentukan sebagai partisi statis dalam pernyataan INSERT. Namun, partisi statis harus merupakan partisi level tinggi.

Apa yang harus saya lakukan jika terjadi kesalahan saat saya menyisipkan data tipe FLOAT ke dalam tabel MaxCompute?

Untuk informasi lebih lanjut tentang tipe data dasar yang didukung oleh edisi tipe data MaxCompute V2.0, lihat Edisi Tipe Data. Data tipe FLOAT tidak berisi konstanta. Untuk menyisipkan data tipe ini, gunakan fungsi CAST untuk mengonversi data menjadi tipe FLOAT. Contohnya: cast(5.1 as float) untuk mengonversi '5.1' dari tipe STRING menjadi 5.1 dari tipe FLOAT.

Jika ingin menggunakan tipe data baru seperti TINYINT, SMALLINT, INT, FLOAT, VARCHAR, TIMESTAMP, atau BINARY dalam SQL MaxCompute, jalankan salah satu perintah berikut untuk mengaktifkan edisi tipe data MaxCompute V2.0 untuk Sesi atau Proyek:

  • Sesi: Tambahkan set odps.sql.type.system.odps2=true; sebelum pernyataan SQL, lalu kirim dan jalankan mereka bersama-sama.

  • Proyek: Jalankan perintah setproject odps.sql.type.system.odps2=true; untuk proyek sebagai pemilik proyek.

Setelah saya menjalankan pernyataan INSERT INTO SELECT dan pernyataan SELECT untuk data yang sama, hasil yang dikembalikan berbeda. Mengapa?

  • Deskripsi Masalah

    Setelah menjalankan pernyataan INSERT INTO SELECT dan pernyataan SELECT secara terpisah untuk bidang tipe STRING yang sama, tempat desimal dalam hasil yang dikembalikan berbeda. Hasil pernyataan SELECT menyimpan dua tempat desimal, sedangkan hasil pernyataan INSERT INTO SELECT menampilkan beberapa tempat desimal.

  • Penyebab

    Jika bidang dalam pernyataan INSERT INTO SELECT adalah tipe STRING, saat dikonversi implisit menjadi tipe DECIMAL, ia pertama-tama dikonversi menjadi tipe DOUBLE, lalu operasi ROUND dilakukan. Data tipe DOUBLE tidak akurat, sehingga beberapa tempat desimal mungkin tetap ditampilkan meskipun operasi ROUND telah dilakukan.

  • Solusi

    Kami sarankan Anda secara eksplisit mengonversi tipe data menggunakan CAST untuk mengonversi tipe data menjadi tipe DECIMAL.

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

Ketika saya menyisipkan data ke dalam bidang tipe VARCHAR(10) di tabel tujuan, apakah kesalahan dikembalikan jika panjang data meluap?

Tidak. Saat data disisipkan ke dalam bidang tipe VARCHAR(10), data dipotong jika panjangnya melampaui batas.

Apa yang harus saya lakukan jika pesan kesalahan "Waktu transaksi habis karena tidak dapat memperoleh kunci eksklusif" muncul saat saya menjalankan pernyataan SQL MaxCompute?

  • Deskripsi Masalah

    Saat menjalankan pernyataan SQL MaxCompute, muncul pesan kesalahan berikut:

    Gagal menjalankan ddltask - Modifikasi DDL meta menghadapi pengecualian : ODPS-0121096:Konflik MetaStore transaksi - Mencapai jumlah percobaan maksimum karena OTSStorageTxnLockKeyFail(Pengecualian internal: Waktu transaksi habis karena tidak dapat memperoleh kunci eksklusif.) 
  • Penyebab

    MaxCompute mengizinkan beberapa pekerjaan menulis data ke satu tabel secara bersamaan. Jika beberapa pekerjaan mengirim metadata pada saat yang sama, setiap pekerjaan perlu mengunci, menulis, lalu membuka kunci metadata pada tabel. Jika metadata tabel tetap terkunci, beberapa pekerjaan mungkin habis waktu sebelum mendapatkan kunci. Akibatnya, pesan kesalahan tidak dapat memperoleh kunci eksklusif dikembalikan. Periode timeout untuk upaya penguncian adalah sekitar 30 detik.

  • Solusi

    Periksa apakah beberapa operasi baca dan tulis dilakukan pada tabel atau partisi tabel secara bersamaan. Kami sarankan Anda tidak melakukan beberapa operasi baca dan tulis pada tabel atau partisi tabel pada saat yang sama.

Bagaimana cara memperbarui data dalam tabel atau partisi MaxCompute?

MaxCompute memungkinkan Anda menjalankan pernyataan UPDATE untuk memperbarui data baris tertentu dalam tabel transaksional.

Jika tabel bukan tabel transaksional, mencoba melakukan operasi update langsung padanya akan menghasilkan kesalahan: trying to update a non-transactional table is not allowed. Set tblproperties ("transactional" = "true") to use this feature.

Anda harus mengimpor data dari partisi sumber atau tabel sumber ke partisi baru atau tabel baru. Operasi pembaruan dilakukan selama impor. Nama partisi baru atau tabel baru bisa sama dengan nama partisi sumber atau tabel sumber, sehingga data diperbarui dalam partisi sumber atau tabel sumber.

Catatan

Metode pembuatan tabel Transaksional dijelaskan dalam Operasi Tabel. MaxCompute hanya mendukung pengaturan properti Transaksional selama pembuatan tabel dan tidak mengizinkan modifikasi properti ini dari tabel yang sudah dibuat menggunakan perintah ALTER TABLE.

Bagaimana cara menghapus data dari tabel atau partisi MaxCompute?

MaxCompute memungkinkan Anda menjalankan pernyataan DELETE untuk menghapus data dari baris tertentu dalam tabel transaksional.

Jika tabel bukan tabel transaksional, gunakan metode berikut untuk menghapus data:

  • Jalankan perintah drop untuk menghapus tabel.

  • Jika tabel adalah tabel non-partisi, jalankan perintah truncate table table_name; untuk menghapus data dari tabel atau gunakan perintah insert overwrite untuk melakukan operasi serupa.

    • Contoh 1: Hapus catatan data di mana nilai Col adalah 1 dari TableA. Contoh perintah:

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

      insert overwrite table TableA select a,b,c.... from TableA where 1=2;
  • Jika ingin menghapus data dari tabel yang dipartisi, jalankan perintah alter table table_name drop if exists partition(Kolom kunci partisi='Nilai partisi spesifik') untuk menghapus partisi.

    Sebagai contoh, jika kolom kunci partisi tabel testtable adalah ds, jalankan perintah berikut untuk menghapus partisi ds='20170520':

    alter table testtable drop if exists partition (ds='20170520');
  • Jalankan pernyataan INSERT dan klausa WHERE untuk mengimpor data yang diperlukan ke partisi baru atau tabel. Jika menjalankan pernyataan INSERT, tabel sumber dan tabel tujuan bisa sama.

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

Jika tabel non-partisi berisi sejumlah besar data, bagaimana cara menghapus data duplikat dari tabel tersebut?

Jika setiap kolom dalam tabel non-partisi berisi data duplikat, lakukan operasi GROUP BY pada semua kolom. Sebagai contoh, jika kolom tabel non-partisi table1 adalah c1, c2, dan c3, jalankan perintah berikut untuk menghapus data duplikat:

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

 c1, c2, c3;
Catatan

Sebelum melakukan operasi ini, kami sarankan Anda mencadangkan data dan mengevaluasi apakah biaya operasi ini lebih rendah daripada biaya impor data berdasarkan jumlah data.