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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 BYifadesinde 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.
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
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Ö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');
_partitiondatesü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,_partitiondateveya 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
WHEREyan tümcelerinde_partitiontimesü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
SaatWHERE _partitiontime >= TIMESTAMP '2025-06-18 07:00:00' AND _partitiontime < TIMESTAMP '2025-06-18 08:00:00'
AyWHERE _partitiontime >= TIMESTAMP '2025-06-01 00:00:00' AND _partitiontime < TIMESTAMP '2025-07-01 00:00:00'
YılWHERE _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.
Zaman işlevlerine dayalı otomatik bölümlenmiş tablolar — bölüm eleme kuralları ve desteklenen filtre ifadeleri
TRUNC_TIME işlevi referansı — desteklenen hassasiyetler ve UTC dönüştürme ayrıntıları
Bölümlenmiş tablolara genel bakış — veri alım zamanına göre bölümlenmiş tabloları standart ve otomatik bölümlenmiş tablolarla karşılaştırma
SHOW CREATE TABLE — herhangi bir veri alım zamanına göre bölümlenmiş tablo için bölüm oluşturma mantığını inceleme