MaxCompute memungkinkan Anda memasukkan data ke dalam partisi dinamis menggunakan pernyataan INSERT INTO atau INSERT OVERWRITE.
Prasyarat
Untuk menjalankan operasi INSERT INTO dan INSERT OVERWRITE, Anda harus memiliki izin Update pada tabel tujuan dan izin Select pada tabel sumber. Untuk informasi selengkapnya tentang cara memberikan izin, lihat Izin MaxCompute.
Cara kerja
Saat menggunakan SQL MaxCompute untuk memproses data, Anda tidak secara langsung menentukan nilai partisi dalam pernyataan INSERT INTO atau INSERT OVERWRITE. Anda hanya menentukan kolom partisi. Nilai untuk kolom partisi disediakan dalam klausa SELECT, dan sistem secara otomatis memasukkan data ke dalam partisi yang sesuai berdasarkan nilai-nilai tersebut.
Untuk informasi tentang memasukkan data ke dalam partisi statis, lihat Masukkan atau timpa data (INSERT INTO | INSERT OVERWRITE).
Batasan
Batasan saat memasukkan data ke dalam partisi dinamis menggunakan operasi INSERT INTO dan INSERT OVERWRITE adalah sebagai berikut:
Pernyataan
INSERT INTOdapat menghasilkan hingga 10.000 partisi dinamis. PernyataanINSERT OVERWRITEdapat menghasilkan hingga 60.000 partisi dinamis.Di lingkungan terdistribusi, satu proses yang menjalankan pernyataan SQL untuk operasi partisi dinamis dapat menulis ke maksimal 512 partisi dinamis. Jika tidak, pekerjaan akan gagal.
Nilai partisi yang dihasilkan secara dinamis tidak boleh NULL. Nilai tersebut juga tidak boleh mengandung karakter khusus atau karakter Tionghoa. Jika tidak, kesalahan berikut dilaporkan:
FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx.CatatanNilai kolom kunci partisi tidak boleh mengandung karakter double-byte, seperti karakter Tionghoa. Nilai kolom kunci partisi harus dimulai dengan huruf dan dapat berisi huruf, angka, serta karakter khusus yang didukung. Panjangnya harus antara 1 hingga 255 byte. Karakter khusus yang didukung meliputi: spasi, titik dua (:), garis bawah (_), tanda dolar ($), tanda pagar (#), titik (.), tanda seru (!), dan tanda at (@). Perilaku karakter lain tidak ditentukan, seperti karakter escape
\t,\n, dan/.Tabel clustered tidak mendukung partisi dinamis.
Catatan penggunaan
Saat memasukkan data ke dalam partisi dinamis, perhatikan hal-hal berikut:
Jika partisi tujuan belum ada saat Anda menjalankan pernyataan
INSERT INTO PARTITION, MaxCompute akan membuatnya secara otomatis.Jika beberapa pekerjaan
INSERT INTO PARTITIONkonkuren mencoba menulis ke partisi yang belum ada, pekerjaan pertama yang berhasil akan membuat partisi tersebut. Hanya satu partisi yang dibuat.Jika Anda tidak dapat mengontrol konkurensi pekerjaan
INSERT INTO PARTITION, buat partisi terlebih dahulu dengan perintahALTER TABLE. Untuk informasi selengkapnya, 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 berada pada tingkat yang lebih tinggi daripada partisi dinamis apa pun.Saat memasukkan data ke dalam partisi dinamis, kolom partisi dinamis harus disertakan dalam daftar
SELECT. Jika tidak, pernyataan akan gagal.
Sintaksis
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. |
ptcol_name | Ya | Nama kolom partisi dalam tabel tujuan. |
select_statement | Ya | Klausa Pemetaan antara kolom dalam daftar |
from_statement | Ya | Klausa |
Data contoh
-- Buat tabel partisi bernama 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 sumber. Langkah ini opsional. Jika Anda tidak membuat partisi terlebih dahulu, partisi tersebut akan dibuat secara otomatis selama operasi penulisan data.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china');
-- Tambahkan data ke tabel sumber. Anda dapat menghilangkan kata kunci TABLE setelah INSERT INTO dan INSERT OVERWRITE.
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 penuh. Pengaturan ini hanya berlaku untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data dalam tabel sale_detail.
SET odps.sql.allow.fullscan=true;
SELECT * FROM sale_detail;
-- Output:
+------------+-------------+-------------+------------+------------+
| 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-contoh berikut menggunakan data dari tabel sale_detail yang dibuat pada bagian Data contoh.
Contoh ini memasukkan data ke dalam tabel tujuan. Partisi dinamis yang dihasilkan ditentukan oleh nilai dalam kolom region.
-- Buat tabel tujuan bernama total_revenues. CREATE TABLE total_revenues (revenue DOUBLE) PARTITIONED BY (region string); -- Masukkan data dari tabel sumber sale_detail ke tabel tujuan 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; -- Output: region=china -- Aktifkan pemindaian penuh. Pengaturan ini hanya berlaku untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data dalam tabel total_revenues. SET odps.sql.allow.fullscan=true; SELECT * FROM total_revenues; -- Output: +------------+------------+ | revenue | region | +------------+------------+ | 100.1 | china | | 100.2 | china | | 100.3 | china | +------------+------------+Contoh ini memasukkan data ke dalam tabel partisi multi-level dan menentukan nilai untuk partisi tingkat pertama, sale_date.
-- Buat tabel tujuan bernama sale_detail_dypart. CREATE TABLE sale_detail_dypart LIKE sale_detail; -- Tentukan partisi tingkat pertama dan masukkan 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 penuh. Pengaturan ini hanya berlaku untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data dalam tabel sale_detail_dypart. SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail_dypart; -- Output: +------------+-------------+-------------+------------+------------+ | 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: Dalam partisi dinamis, pemetaan antara bidang select_statement dan partisi dinamis tabel tujuan ditentukan berdasarkan urutan bidang, bukan berdasarkan nama kolom. Berikut adalah contoh perintah:
-- Masukkan data dari tabel sumber sale_detail ke tabel tujuan 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 penuh. Pengaturan ini hanya berlaku untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data dalam tabel sale_detail_dypart. SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail_dypart; -- Output: -- Bidang sale_date dari tabel sumber dipetakan ke kolom partisi dinamis sale_date tabel tujuan. -- Bidang region dari tabel sumber dipetakan ke kolom partisi dinamis region tabel tujuan. +------------+-------------+-------------+------------+------------+ | 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 | +------------+-------------+-------------+------------+------------+ -- Masukkan data dari tabel sale_detail ke tabel sale_detail_dypart dan ubah urutan bidang SELECT. 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 penuh. Pengaturan ini hanya berlaku untuk sesi saat ini. Jalankan pernyataan SELECT untuk melihat data dalam tabel sale_detail_dypart. SET odps.sql.allow.fullscan=true; SELECT * FROM sale_detail_dypart; -- Output: -- Bidang region dari tabel sumber dipetakan ke kolom partisi dinamis sale_date tabel tujuan. -- Bidang sale_date dari tabel sumber dipetakan ke kolom partisi dinamis region tabel tujuan. +------------+-------------+-------------+------------+------------+ | 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 | +------------+-------------+-------------+------------+------------+Contoh 4 (Salah): Contoh ini gagal karena kolom partisi dinamis tidak disertakan dalam daftar
SELECT.INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date='2013', region) SELECT shop_name,customer_id,total_price FROM sale_detail;Output:
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 (Salah): Contoh ini gagal karena partisi tingkat lebih tinggi tidak boleh bersifat dinamis jika partisi tingkat lebih rendah bersifat statis.
INSERT OVERWRITE TABLE sale_detail_dypart PARTITION (sale_date, region='china') SELECT shop_name,customer_id,total_price,sale_date FROM sale_detail_dypart;Output:
FAILED: ODPS-0130071:[1,72] Semantic analysis exception - static partition region must be a high level partition than any dynamic partitionsContoh 6: Saat memasukkan data ke dalam partisi dinamis, MaxCompute melakukan konversi implisit jika tipe data kolom partisi tidak secara ketat sesuai dengan kolom yang sesuai dalam pernyataan
SELECT. Berikut contoh perintahnya:-- Buat tabel sumber bernama src. CREATE TABLE src (c INT, d STRING) PARTITIONED BY (e INT); -- Tambahkan partisi ke tabel sumber src. ALTER TABLE src ADD IF NOT EXISTS PARTITION (e=201312); -- Tambahkan data ke tabel sumber src. INSERT INTO src PARTITION (e=201312) VALUES (1,100.1),(2,100.2),(3,100.3); -- Buat tabel tujuan bernama parttable. CREATE TABLE parttable(a INT, b DOUBLE) PARTITIONED BY (p STRING); -- Masukkan data dari tabel sumber src ke tabel tujuan parttable. SET odps.sql.allow.fullscan=true; INSERT INTO parttable PARTITION (p) SELECT c, d, CURRENT_TIMESTAMP() FROM src; -- Kueri tabel tujuan parttable. SET odps.sql.allow.fullscan=true; SELECT * FROM parttable; -- Output: +------------+------------+------------+ | 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 | +------------+------------+------------+CatatanPenyisipan partisi dinamis dapat menyebabkan data tersebar, sehingga mengurangi rasio kompresi. Untuk kompresi yang lebih baik, gunakan perintah Tunnel untuk mengunggah data ke partisi dinamis. Contoh penggunaan perintah ini secara detail tersedia di Migrasikan data dari ApsaraDB RDS ke MaxCompute berdasarkan partisi dinamis.