Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Ingestion-time partitioned tables

Son Güncelleme:Oct 04, 2026

Veri alım zamanına göre bölümlenmiş tablolar, gelen satırları MaxCompute üzerine yazıldıkları zamana bağlı olarak otomatik şekilde bölümlere atar. Bir bölüm anahtarını manuel olarak belirtmek yerine, bir _partitiontime sahte sütunu ve bir TRUNC_TIME ifadesi tanımlarsınız. MaxCompute yazma zaman damgasını yakalar, seçilen hassasiyete (saat, gün, ay veya yıl) göre keser ve sizin için bölüm anahtarı sütununu oluşturur.

Örneğin, saatlik bölümlendirme ile bir tablo oluşturup aşağıdaki saatlerde veri yazarsanız:


Veri alım zamanı (UTC+8)


Oluşturulan _partitiontime (TIMESTAMP)


Oluşturulan bölüm anahtarı (STRING)


2025-06-18 17:22:00


2025-06-18 17:00:00


2025-06-18 09:00:00


2025-06-18 17:40:00


2025-06-18 17:00:00


2025-06-18 09:00:00


2025-06-18 18:31:00


2025-06-18 18:00:00


2025-06-18 10:00:00

TRUNC_TIME işlevi, kesme işleminden önce yerel zaman damgasını UTC'ye dönüştürür; bu nedenle STRING türündeki bölüm anahtarı UTC zamanını yansıtır. Ayrıntılar için bkz. Saat dilimi davranışı.

MaxCompute'daki tüm bölümlenmiş tablo türlerine genel bir bakış için bkz. Bölümlenmiş tablolara genel bakış.

Sınırlamalar

  • Yalnızca tek bir bölüm sütunu desteklenir. Çok düzeyli bölümlendirme desteklenmez.

  • Bölüm sütununun veri türü her zaman STRING'dir. Bu durum değiştirilemez.

  • Veri alım zamanına dayalı otomatik bölümlendirme yalnızca MaxCompute SQL yazma işlemleri için çalışır. Flink bağlayıcısı gibi diğer veri alım yöntemleri desteklenmez.

  • AUTO PARTITIONED BY ifadesinde yalnızca TRUNC_TIME işlevi desteklenir.

Saat dilimi davranışı

TRUNC_TIME işlevi, kesme işleminden önce alım zaman damgasını projenin yerel saat diliminden UTC'ye dönüştürür. Projeniz farklı bir saat diliminde çalışsa bile STRING bölüm anahtarı değeri her zaman UTC cinsindendir.

Önemli

Beklenmeyen bölüm anahtarı değerlerinden kaçınmak için projenizin saat dilimini UTC olarak ayarlayın: Projeniz UTC dışı bir saat dilimi kullanıyorsa (örneğin Asia/Shanghai, UTC+8), kesilmiş UTC değeri yerel saatten UTC farkı kadar farklı olur. Bu konudaki sorgu örnekleri, bu etkiyi göstermek amacıyla Asia/Shanghai saat dilimini kullanır; bu nedenle sonuçlarda _partitiontime ile bölüm anahtarı sütunu arasında 8 saatlik bir fark görülür.

SET odps.sql.timezone=UTC;

Veri alım zamanına göre bölümlenmiş bir tablo oluşturma

Söz dizimi

CREATE [OR REPLACE] TABLE [IF NOT EXISTS] <table_name>
  (_partitiontime <data_type>, <col_name> <data_type> [, ...])
  [COMMENT <table_comment>]
AUTO PARTITIONED BY (<auto_partition_expression> [AS <auto_partition_column_name>])
TBLPROPERTIES('ingestion_time_partition'='true');

Parametreler


Parametre


Gerekli mi?


Açıklama


table_name


Evet


Oluşturulacak tablonun adı.


_partitiontime


Evet


Kesilmiş alım zaman damgasını depolayan sahte sütun. Sütun adı sabittir ve değiştirilemez. Desteklenen veri türleri: TIMESTAMP ve TIMESTAMP_NTZ.


col_name


Evet


Düzenli bir sütun adı.


data_type


Evet


Sütunun veri türü.


table_comment


Hayır


Tablo açıklaması.


TBLPROPERTIES('ingestion_time_partition'='true')


Evet


Tabloyu veri alım zamanına göre bölümlenmiş tablo olarak işaretler.


auto_partition_expression


Evet


Bölüm anahtarını türeten ifade. Yalnızca TRUNC_TIME desteklenir. MaxCompute alım zamanını otomatik olarak yakalar ve bölüm anahtarı değerini oluşturmak için bunu TRUNC_TIME işlevine iletir.


auto_partition_column_name


Hayır


Oluşturulan bölüm sütunu için ad. Varsayılan değer _pt_col_0_ değeridir. Bu ad zaten kullanılıyorsa sistem sırasıyla _pt_col_1_, _pt_col_2_ vb. adları kullanır. Oluşturulan sütunun veri türü STRING'dir ve doğrudan değiştirilemez.

Örnekler

Örnek 1: Saate göre bölümlendirme

Aşağıdaki ifade ingestion_sale_detail_hourly tablosunu oluşturur. Veri yazıldığında MaxCompute alım zamanını saate göre keser, _partitiontime sütununu doldurur ve UTC sonucunu sale_time bölüm sütunu olarak depolar.

-- The system captures the write time, truncates it to the hour,
-- and stores the UTC value as the sale_time partition key.
CREATE TABLE IF NOT EXISTS ingestion_sale_detail_hourly (
  shop_name    STRING,
  total_price  DOUBLE,
  _partitiontime TIMESTAMP
)
AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'hour') AS sale_time)
TBLPROPERTIES('ingestion_time_partition'='true');

Tabloyu incelemek için DESC ingestion_sale_detail_hourly; komutunu çalıştırın. Çıktıda sale_time sütunu STRING türünde bir bölüm sütunu olarak gösterilir:

+------------------------------------------------------------------------------------+
| Owner:                    ALIYUN$test****                                          |
| Project:                   xxxxxxx                                                 |
| Schema:                    default                                                 |
| TableComment:                                                                      |
+------------------------------------------------------------------------------------+
| CreateTime:               2025-06-16 14:59:40                                      |
| LastDDLTime:              2025-06-16 14:59:40                                      |
| LastModifiedTime:         2025-06-16 14:59:40                                      |
+------------------------------------------------------------------------------------+
| InternalTable: YES      | Size: 0                                                  |
+------------------------------------------------------------------------------------+
| Native Columns:                                                                    |
+------------------------------------------------------------------------------------+
| Field           | Type       | Label | Comment                                     |
+------------------------------------------------------------------------------------+
| shop_name       | string     |       |                                             |
| total_price     | double     |       |                                             |
| _partitiontime  | timestamp  |       |                                             |
+------------------------------------------------------------------------------------+
| Partition Columns:                                                                 |
+------------------------------------------------------------------------------------+
| sale_time       | string     |                                                     |
+------------------------------------------------------------------------------------+

Örnek 2: Güne göre bölümlendirme

Hassasiyet day (gün) olarak belirlendiğinde, MaxCompute _partitiontime sütununun yanı sıra DATE türünde bir _partitiondate sahte sütunu da oluşturur.

CREATE TABLE IF NOT EXISTS ingestion_sale_detail_daily (
  shop_name    STRING,
  total_price  DOUBLE,
  _partitiontime TIMESTAMP
)
AUTO PARTITIONED BY (TRUNC_TIME(_partitiontime, 'day') AS sale_date)
TBLPROPERTIES('ingestion_time_partition'='true');
_partitiondate sütununu görüntülemek için sorguya açıkça ekleyin: SELECT *, _partitiondate FROM ingestion_sale_detail_daily; Bölüm oluşturma mantığını incelemek için SHOW CREATE TABLE ifadesini kullanın.

Veri alım zamanına göre bölümlenmiş bir tabloya veri yazma

Aşağıdaki tüm örnekler, Veri alım zamanına göre bölümlenmiş bir tablo oluşturma bölümünde oluşturulan ingestion_sale_detail_hourly ve ingestion_sale_detail_daily tablolarına veri yazar.

INSERT ifadesinden _partitiontime sütununu çıkarırsanız MaxCompute geçerli yazma zamanını kullanır. Bir değer sağlarsanız bu değer, CREATE TABLE ifadesinde tanımlanan aynı hassasiyete göre kesilmiş olmalıdır.

Örnek 1: Bölümü sistemin atamasını sağlama

_partitiontime sütununu atlayın. MaxCompute geçerli yazma zaman damgasını kullanır ve bunu saate göre keser.

INSERT INTO ingestion_sale_detail_hourly (shop_name, total_price)
VALUES
  ('shanghai_shop', 10001.1),
  ('chongqin_shop', 20002.2),
  ('hangzhou_shop', 30003.3),
  ('shenzhen_shop', 40004.4);

Örnek 2: Alım zamanını açıkça belirtme

Değer, bildirilen hassasiyete (bu durumda saatlik) göre kesilmiş olmalıdır.

Geçerli — 2025-06-15 14:00:00 değeri saat sınırındadır:

INSERT INTO ingestion_sale_detail_hourly (shop_name, total_price, _partitiontime)
VALUES
  ('beijing_shop', 50005.5, TIMESTAMP '2025-06-15 14:00:00'),
  ('chengdu_shop', 60006.6, TIMESTAMP '2025-06-14 05:00:00');

Geçersiz — 2025-06-15 14:30:00 değeri saat sınırı değildir:

INSERT INTO ingestion_sale_detail_hourly (shop_name, total_price, _partitiontime)
VALUES ('beijing_shop', 50005.5, TIMESTAMP '2025-06-15 14:30:00');

Dönen hata:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed:
SQL Runtime Unretryable Error: ODPS-0121095:Invalid argument - illegal ingestion time: 2025-06-15 14:30:00

Örnek 3: Günlük bölümlenmiş tablo — yalnızca _partitiontime belirtin

Günlük bölümlenmiş tablolar için yalnızca _partitiontime değerini sağlayın. _partitiondate değeri bir INSERT ifadesinde belirtilmemelidir.

Geçerli — 2025-06-18 00:00:00 değeri günün başlangıcıdır:

INSERT INTO ingestion_sale_detail_daily (shop_name, total_price, _partitiontime)
VALUES ('beijing_shop', 50005.5, TIMESTAMP '2025-06-18 00:00:00');

Geçersiz — 2025-06-18 14:00:00 değeri günün başlangıcı değildir:

INSERT INTO ingestion_sale_detail_daily (shop_name, total_price, _partitiontime)
VALUES ('beijing_shop', 50005.5, TIMESTAMP '2025-06-18 14:00:00');

Dönen hata:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed:
SQL Runtime Unretryable Error: ODPS-0121095:Invalid argument - illegal ingestion time: 2025-06-18 14:00:00

Geçersiz — _partitiondate sütununu doğrudan belirtme:

INSERT INTO ingestion_sale_detail_daily (shop_name, total_price, _partitiondate)
VALUES ('beijing_shop', 50005.5, DATE '2025-06-15');

Dönen hata:

FAILED: ODPS-0130071:[1,64] Semantic analysis exception - column _partitiondate cannot be resolved;
Did you mean _partitiontime ?

Veri alım zamanına göre bölümlenmiş bir tabloyu sorgulama

Aşağıdaki tüm örnekler, Veri alım zamanına göre bölümlenmiş bir tablo oluşturma bölümünde oluşturulan tabloları sorgular.

Akılda tutulması gereken iki davranış şunlardır:

  • SELECT * ifadesi not _partitiontime, _partitiondate veya oluşturulan bölüm sütununu döndürmez. Bunları sonuca dahil etmek için açıkça belirtin.

  • Bölüm elemeyi tetiklemek için WHERE yan tümcelerinde _partitiontime sütununu kullanın. Aşağıdaki filtre ifadeleri, veri alım zamanına göre bölümlenmiş tablolar için bölüm elemeyi tetikler. Desteklenen eleme ifadelerinin tam listesi için bkz. Zaman işlevlerine dayalı otomatik bölümlenmiş tablolar.


    Hassasiyet


    Örnek filtre


    Saat


    WHERE _partitiontime >= TIMESTAMP '2025-06-18 07:00:00' AND _partitiontime < TIMESTAMP '2025-06-18 08:00:00'


    Ay


    WHERE _partitiontime >= TIMESTAMP '2025-06-01 00:00:00' AND _partitiontime < TIMESTAMP '2025-07-01 00:00:00'


    Yıl


    WHERE _partitiontime >= TIMESTAMP '2025-01-01 00:00:00' AND _partitiontime < TIMESTAMP '2026-01-01 00:00:00'

Örnek 1: Temel SELECT — sahte sütunlar varsayılan olarak gizlidir

SELECT * FROM ingestion_sale_detail_hourly;

-- Result:
+---------------+-------------+
| shop_name     | total_price |
+---------------+-------------+
| shanghai_shop | 10001.1     |
| chongqin_shop | 20002.2     |
| hangzhou_shop | 30003.3     |
| shenzhen_shop | 40004.4     |
| chengdu_shop  | 60006.6     |
| beijing_shop  | 50005.5     |
+---------------+-------------+

Örnek 2: Sahte sütunları ve bölüm sütunlarını açıkça dahil etme

Proje saat dilimi Asia/Shanghai (UTC+8) olarak ayarlanmıştır. TRUNC_TIME işlevi kesme işleminden önce UTC'ye dönüştürdüğünden, sale_time (bölüm anahtarı) değeri _partitiontime değerinden 8 saat geridedir.

Saatlik bölümlenmiş tabloyu sorgulayın:

SELECT *, _partitiontime, sale_time FROM ingestion_sale_detail_hourly;

-- Result:
+---------------+-------------+---------------------+---------------------+
| shop_name     | total_price | _partitiontime      | sale_time           |
+---------------+-------------+---------------------+---------------------+
| shanghai_shop | 10001.1     | 2025-06-18 15:00:00 | 2025-06-18 07:00:00 |
| chongqin_shop | 20002.2     | 2025-06-18 15:00:00 | 2025-06-18 07:00:00 |
| hangzhou_shop | 30003.3     | 2025-06-18 15:00:00 | 2025-06-18 07:00:00 |
| shenzhen_shop | 40004.4     | 2025-06-18 15:00:00 | 2025-06-18 07:00:00 |
| beijing_shop  | 50005.5     | 2025-06-15 14:00:00 | 2025-06-15 06:00:00 |
| chengdu_shop  | 60006.6     | 2025-06-14 05:00:00 | 2025-06-13 21:00:00 |
+---------------+-------------+---------------------+---------------------+

Günlük bölümlenmiş tabloyu sorgulayın:

SELECT *, _partitiontime, _partitiondate, sale_date FROM ingestion_sale_detail_daily;

-- Result:
+--------------+-------------+---------------------+----------------+-----------+
| shop_name    | total_price | _partitiontime      | _partitiondate | sale_date |
+--------------+-------------+---------------------+----------------+-----------+
| beijing_shop | 50005.5     | 2025-06-18 00:00:00 | 2025-06-18     | 2025-06-18|
+--------------+-------------+---------------------+----------------+-----------+

Ayrıca bkz.