Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Dinamik bölümlerde veri ekleme veya üzerine yazma

Son Güncelleme:Oct 09, 2026

MaxCompute, dinamik bölümlere INSERT INTO veya INSERT OVERWRITE kullanarak veri eklemenizi sağlar.

Bu konudaki komutları aşağıdaki platformlarda çalıştırabilirsiniz:

Ön koşullar

INSERT INTO ve INSERT OVERWRITE işlemlerini yapmak için hedef tablo üzerinde Update iznine ve kaynak tablo üzerinde Select iznine sahip olmanız gerekir. İzinlerin nasıl verileceği hakkında daha fazla bilgi için bkz. MaxCompute İzinleri.

Çalışma mekanizması

Dinamik bölümlere yazmak için bir INSERT INTO veya INSERT OVERWRITE deyimi kullandığınızda, bölüm anahtar sütunlarının değerlerini değil yalnızca sütun adlarını belirtirsiniz. MaxCompute, her satırın hedef bölümünü SELECT yan tümcesindeki karşılık gelen değerlere göre belirler.

Statik bölümlere veri eklemeyi öğrenmek için bkz. Veri ekleme veya üzerine yazma (INSERT INTO | INSERT OVERWRITE).

Sınırlamalar

INSERT INTO veya INSERT OVERWRITE kullanarak dinamik bölümlere veri eklerken aşağıdaki sınırlamalar geçerlidir:

  • Bir INSERT INTO işlemi en fazla 10.000 dinamik bölüm oluşturabilir. Bir INSERT OVERWRITE işlemi en fazla 60.000 dinamik bölüm oluşturabilir.

  • Dağıtılmış bir ortamda, tek bir süreç dinamik bölümleme kullanan bir SQL deyiminde en fazla 512 dinamik bölüme yazabilir. Bu sınır aşılırsa iş başarısız olur.

  • Dinamik olarak oluşturulan bölüm değerleri NULL olamaz ve özel karakterler veya Çince karakterler içeremez. Aksi takdirde aşağıdaki hata bildirilir: FAILED: ODPS-0123031:Partition exception - invalid dynamic partition value: province=xxx.

    Not

    Bölüm anahtar sütununun değeri Çince karakterler gibi çift baytlı karakterler içeremez. Bölüm anahtar sütununun değeri bir harfle başlamalı; harf, rakam ve desteklenen özel karakterler içerebilir. Uzunluğu 1 ila 255 bayt arasında olmalıdır. Aşağıdaki özel karakterler desteklenir: boşluklar, iki nokta üst üste (:), alt çizgi (_), dolar işareti ($), diyez (#), nokta (.), ünlem işareti (!) ve at işareti (@). Kaçış karakterleri \t, \n ve / gibi diğer karakterlerin davranışı tanımlanmamıştır.

  • Küme tabloları dinamik bölümleri desteklemez.

Kullanım notları

Dinamik bölümlerdeki verileri güncellerken şunlara dikkat edin:

  • INSERT INTO PARTITION kullanırken, bir bölüm mevcut değilse otomatik olarak oluşturulur.

  • Birden çok eşzamanlı INSERT INTO PARTITION işi çalıştırılıyorsa ve hedef bölüm mevcut değilse başarıyla tamamlanan ilk iş bölümü otomatik olarak oluşturur. Yalnızca bir bölüm oluşturulur.

  • INSERT INTO PARTITION işlerinin eşzamanlılığını kontrol edemiyorsanız bir ALTER TABLE komutu kullanarak bölümleri önceden oluşturun. Daha fazla bilgi için bkz. Bölüm işlemleri.

  • Hedef tabloda birden çok bölüm düzeyi varsa bir INSERT işlemi yaparken bazı bölümleri statik bölüm olarak belirtebilirsiniz. Ancak statik bölümler üst düzey bölümler olmalıdır.

  • Dinamik bölümlere veri eklerken dinamik bölüm sütunları SELECT listesine dahil edilmelidir. Aksi takdirde işlem başarısız olur.

Söz dizimi

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

Parametreler


Parametre


Gerekli


Açıklama


table_name


Evet


Veri eklemek istediğiniz hedef tablonun adı.


ptcol_name


Evet


Hedef tablodaki bir bölüm anahtar sütununun adı.


select_statement


Evet

SELECT yan tümcesi. Hedef tabloya eklenecek verileri kaynak tablodan sorgular.

Hedef tablonun yalnızca bir dinamik bölüm düzeyi varsa SELECT yan tümcesindeki son sütun dinamik bölüm için değeri belirtir. Kaynak tablonun SELECT listesinden gelen değerler ile çıktı bölüm değerleri arasındaki eşleme sütun adına değil sütun sırasına göre belirlenir. Uyumsuzlukları önlemek için select_statement içindeki sütun sırasının hedef tablonun sütun sırasıyla eşleştiğinden emin olun.


from_statement


Evet

FROM yan tümcesi. Kaynak tablonun adı gibi veri kaynağını belirtir.

Örnek veriler

-- Create a partitioned table named 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);

-- Add a partition to the source table. This step is optional. If you do not create the partition in advance, it is created automatically when data is written to it.
ALTER TABLE sale_detail ADD PARTITION (sale_date='2013', region='china');

-- Append data to the source table. The TABLE keyword after INSERT INTO or INSERT OVERWRITE can be omitted.
INSERT INTO sale_detail PARTITION (sale_date='2013', region='china') VALUES ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);

-- Enable a full scan. This setting is valid only for the current session. Run a SELECT statement to view the data in the sale_detail table.
SET odps.sql.allow.fullscan=true; 
SELECT * FROM sale_detail;

-- The following result is returned:
+------------+-------------+-------------+------------+------------+
| 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      |
+------------+-------------+-------------+------------+------------+

Örnekler

Aşağıdaki örneklerde kullanılan sale_detail tablosundaki veriler Örnek veriler bölümünden alınmıştır.

  • Örnek 1: Bu örnekte, hedef bölümlerin region sütunundaki değerlerle dinamik olarak belirlendiği bir kaynak tablodan hedef tabloya veri eklenmektedir.

    -- Create a target table named total_revenues.
    CREATE TABLE total_revenues (revenue DOUBLE) PARTITIONED BY (region string);
    
    -- Insert data from the sale_detail source table into the total_revenues target table.
    SET odps.sql.allow.fullscan=true; 
    INSERT OVERWRITE TABLE total_revenues PARTITION(region) SELECT total_price AS revenue, region FROM sale_detail;
    
    -- Run the SHOW PARTITIONS statement to view the partitions of the total_revenues table.
    SHOW PARTITIONS total_revenues;
       
    -- The following result is returned:
    region=china  
    
    -- Enable a full scan. This setting is valid only for the current session. Run a SELECT statement to view the data in the total_revenues table.  
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM total_revenues;    
    
    -- The following result is returned:
    +------------+------------+
    | revenue    | region     |
    +------------+------------+
    | 100.1      | china      |
    | 100.2      | china      |
    | 100.3      | china      |
    +------------+------------+        
  • Örnek 2: Bu örnekte, üst düzey sale_date bölümü statik olarak belirtilerek çok düzeyli bölümlendirilmiş bir tabloya veri eklenmektedir.

    -- Create a target table named sale_detail_dypart. 
    CREATE TABLE sale_detail_dypart LIKE sale_detail; 
    
    -- Specify the high-level partition and insert data into the target table.
    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;
    
    -- Enable a full scan. This setting is valid only for the current session. Run a SELECT statement to view the data in the sale_detail_dypart table.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    -- The following result is returned:
    +------------+-------------+-------------+------------+------------+
    | 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      |
    +------------+-------------+-------------+------------+------------+
  • Örnek 3: Bu örnek, dinamik bölüm eşlemesinin sütun adlarına değil select_statement içindeki sütun sırasına dayandığını göstermektedir.

    -- Insert data from the sale_detail source table into the sale_detail_dypart target table.
    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;
    
    -- Enable a full scan. This setting is valid only for the current session. Run a SELECT statement to view the data in the sale_detail_dypart table.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    -- The following result is returned:
    -- The sale_date column of the source table sale_detail determines the sale_date dynamic partition of the target table sale_detail_dypart.
    -- The region column of the source table sale_detail determines the region dynamic partition of the target table sale_detail_dypart.
    +------------+-------------+-------------+------------+------------+
    | 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      |
    +------------+-------------+-------------+------------+------------+
    
    -- Insert data from the sale_detail source table into the sale_detail_dypart target table and adjust the column order in the 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;
    
    -- Enable a full scan. This setting is valid only for the current session. Run a SELECT statement to view the data in the sale_detail_dypart table.
    SET odps.sql.allow.fullscan=true; 
    SELECT * FROM sale_detail_dypart;
    
    -- The following result is returned:
    -- The region column of the source table sale_detail determines the sale_date dynamic partition of the target table sale_detail_dypart.
    -- The sale_date column of the source table sale_detail determines the region dynamic partition of the target table sale_detail_dypart.
    +------------+-------------+-------------+------------+------------+
    | 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      |
    +------------+-------------+-------------+------------+------------+
  • Örnek 4 (Hatalı): Dinamik bölüm sütunları SELECT listesine dahil edilmediğinden bu deyim başarısız olur.

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

    Aşağıdaki sonuç döndürülür:

    FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 3 in data source, requires 4 columns (includes dynamic partitions if any)
  • Örnek 5 (Hatalı): Statik bölümler herhangi bir dinamik bölümden daha üst düzeyde olması gerektiğinden bu deyim başarısız olur.

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

    Aşağıdaki sonuç döndürülür:

    FAILED: ODPS-0130071:[1,72] Semantic analysis exception - static partition region must be a high level partition than any dynamic partitions
  • Örnek 6: Bu örnek, bir bölüm sütununun veri türünün SELECT yan tümcesindeki karşılık gelen değer türüyle eşleşmemesi durumunda MaxCompute'ün bir örtük dönüştürme yaptığını gösterir.

    -- Create a source table named src.
    CREATE TABLE src (c INT, d STRING) PARTITIONED BY (e INT);
    
    -- Add a partition to the source table src.
    ALTER TABLE src ADD IF NOT EXISTS PARTITION (e=201312);
    
    -- Append data to the source table src.
    INSERT INTO src PARTITION (e=201312) VALUES (1,100.1),(2,100.2),(3,100.3);
    
    -- Create a target table named parttable.
    CREATE TABLE parttable(a INT, b DOUBLE) PARTITIONED BY (p STRING);
    
    -- Insert data from the source table src into the target table parttable.
    SET odps.sql.allow.fullscan=true; 
    INSERT INTO parttable PARTITION (p) SELECT c, d, CURRENT_TIMESTAMP() FROM src;
    
    -- Query the target table parttable.
    SET odps.sql.allow.fullscan=true;
    SELECT * FROM parttable;
    
    -- The following result is returned:
    +------------+------------+------------+
    | 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 |
    +------------+------------+------------+
    Not

    Verileriniz sıralıysa bunların dinamik bölümlere eklenmesi sıralama düzenini bozarak sıkıştırma oranını düşürebilir. Daha iyi bir sıkıştırma oranı için sıralı verileri yüklemek amacıyla Tunnel komutunu kullanın. Bu komutun nasıl kullanılacağına ilişkin ayrıntılı bir örnek için bkz. Dinamik bölümlendirmeye dayalı olarak ApsaraDB RDS'den MaxCompute'e veri geçirme.