MaxCompute dapat secara otomatis mempartisi tabel berdasarkan waktu pemasukan data. Tabel semacam ini, yang dikenal sebagai tabel partisi berdasarkan waktu pemasukan data, menangkap waktu pemasukan data dan menggunakan fungsi waktu tertentu, seperti `TRUNC_TIME`, untuk menghasilkan nilai kolom kunci partisi. Topik ini menjelaskan cara menggunakan tabel tersebut.
Fitur
MaxCompute menyediakan dua jenis tabel partisi: tabel partisi standar dan tabel auto-partisi. Anda dapat memilih jenis tabel berdasarkan cara menghasilkan kolom kunci partisi sesuai skenario Anda. Untuk informasi selengkapnya, lihat Ikhtisar tabel partisi.
Untuk menggunakan tabel partisi berdasarkan waktu pemasukan data, Anda harus menentukan pseudo-kolom bernama _partitiontime dengan tipe data berbasis waktu dalam definisi tabel. Sistem memotong (truncate) waktu pemasukan data setiap baris ke granularitas waktu tertentu—seperti jam, hari, bulan, atau tahun—lalu menggunakan waktu yang telah dipotong tersebut untuk mengisi pseudo-kolom _partitiontime secara otomatis.
Sebagai contoh, jika Anda membuat tabel partisi berdasarkan waktu pemasukan data yang menghasilkan partisi per jam dan menulis data pada waktu-waktu berikut:
Waktu pemasukan data (UTC+8) | Kolom _PARTITIONTIME yang dihasilkan (TIMESTAMP) | Partisi yang dihasilkan (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 |
Pada contoh di atas, sistem memotong waktu pemasukan data untuk mengisi kolom _partitiontime. Nilai tersebut kemudian dikonversi ke string UTC dan digunakan sebagai nilai kolom kunci partisi.
Batasan
Tabel partisi berdasarkan waktu pemasukan data hanya mendukung satu kolom kunci partisi. Partisi multi-level tidak didukung.
Kolom kunci partisi dari tabel partisi berdasarkan waktu pemasukan data memiliki tipe data default STRING. Tipe data ini tidak dapat diubah.
Fitur auto-partisi berdasarkan fungsi waktu dan waktu pemasukan data hanya didukung untuk penulisan data menggunakan MaxCompute SQL. Metode ingest data lainnya, seperti konektor Flink, tidak didukung.
Saat memotong waktu pemasukan data, hanya fungsi TRUNC_TIME yang didukung. Fungsi ini mengonversi waktu lokal ke UTC sebelum memotong nilainya. Karena konversi ini, zona waktu memengaruhi nilai akhir kolom kunci partisi bertipe STRING. Anda harus mengatur zona waktu proyek ke UTC dengan menjalankan pernyataan
SET odps.sql.timezone=UTC;.
Penggunaan
Buat tabel partisi berdasarkan waktu pemasukan data
Sintaks
Gunakan sintaks berikut untuk membuat tabel partisi berdasarkan waktu pemasukan data.
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');Parameter:
Parameter | Wajib | Deskripsi |
table_name | Ya | Nama tabel yang akan dibuat. |
_partitiontime | Ya | Pseudo-kolom untuk waktu pemasukan data yang telah dipotong. Nama kolom tidak dapat diubah. Tipe data yang didukung adalah TIMESTAMP dan TIMESTAMP_NTZ. |
col_name | Ya | Nama kolom. |
data_type | Ya | Tipe data kolom. |
table_comment | Tidak | Komentar tabel. |
TBLPROPERTIES('ingestion_time_partition'='true') | Ya | Menentukan bahwa tabel yang akan dibuat adalah tabel partisi berdasarkan waktu pemasukan data. Kolom kunci partisi dihasilkan berdasarkan waktu pemasukan data. |
auto_partition_expression | Ya | Ekspresi yang mendefinisikan perhitungan untuk kolom kunci partisi. Saat ini, hanya fungsi TRUNC_TIME yang didukung untuk menghitung pseudo-kolom Catatan Saat Anda membuat tabel partisi berdasarkan waktu pemasukan data, sistem secara otomatis mendapatkan waktu pemasukan data. Sistem kemudian memotong waktu ini menggunakan fungsi TRUNC_TIME untuk menghasilkan nilai kolom kunci partisi. |
auto_partition_column_name | Tidak | Nama kolom kunci partisi yang dihasilkan. Jika Anda tidak menentukan nama, sistem menggunakan Catatan Setelah ekspresi partisi dihitung, kolom kunci partisi bertipe STRING dihasilkan berdasarkan hasil tersebut. Anda tidak dapat langsung mengubah tipe data atau nilai kolom ini. |
Contoh
Contoh 1
Contoh ini membuat tabel partisi berdasarkan waktu pemasukan data bernama
ingestion_sale_detail_hourlyyang dipartisi per jam. Definisi tabel menentukan pseudo-kolom bernama_partitiontimebertipe TIMESTAMP. Saat data ditulis ke tabel, sistem secara otomatis mendapatkan waktu pemasukan data, lalu mengisi pseudo-kolom_partitiontimeberdasarkan granularitas per jam yang ditentukan dalam pernyataan DDL. Nilai kolom kunci partisisale_timekemudian dihasilkan berdasarkan hasil tersebut.-- Setelah tabel dibuat, sistem secara otomatis mendapatkan waktu pemasukan data saat data ditulis. Sistem memotong _partitiontime per jam, menghasilkan kolom kunci partisi bernama sale_time, dan mempartisi tabel berdasarkan kolom ini. 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');Tabel
ingestion_sale_detail_hourlyyang dibuat pada contoh di atas berisi empat kolom. Kolomsale_timeadalah kolom kunci partisi yang dihasilkan secara otomatis bertipe STRING. Anda dapat menjalankan pernyataanDESC ingestion_sale_detail_hourly;untuk melihat informasi tabel. Berikut adalah contoh hasilnya:+------------------------------------------------------------------------------------+ | 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 | | +------------------------------------------------------------------------------------+Contoh 2
Contoh ini membuat tabel partisi berdasarkan waktu pemasukan data bernama
ingestion_sale_detail_dailyyang dipartisi per hari. Jika granularitas partisi per hari, pseudo-kolom tambahan bernama_partitiondatebertipe DATE juga dihasilkan, bersama dengan pseudo-kolom_partitiontime.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');CatatanAnda dapat menjalankan perintah
SELECT *, _partitiondate FROM ingestion_sale_detail_daily;untuk melihat pseudo-kolom_partitiondate.Untuk melihat logika pembuatan partisi untuk kolom kunci partisi berdasarkan waktu pemasukan data, Anda dapat menggunakan pernyataan SHOW CREATE TABLE.
Tulis data ke tabel partisi berdasarkan waktu pemasukan data
Saat menggunakan pernyataan SQL untuk menulis data ke tabel partisi berdasarkan waktu pemasukan data, Anda dapat menentukan nilai untuk pseudo-kolom _partitiontime. Namun, granularitas waktu nilai _partitiontime harus sesuai dengan granularitas yang ditentukan dalam pernyataan `CREATE TABLE`.
Jika Anda tidak menentukan nilai untuk _partitiontime, sistem secara otomatis menggunakan waktu saat data ditulis ke MaxCompute, lalu menerapkan fungsi waktu yang ditentukan untuk mengisi pseudo-kolom _partitiontime, menghasilkan nilai kolom kunci partisi, dan mempartisi data tersebut sesuai.
Contoh:
Contoh-contoh berikut menunjukkan cara menulis data ke tabel ingestion_sale_detail_hourly dan ingestion_sale_detail_daily yang dibuat di bagian Contoh.
Contoh 1
Saat memasukkan data, jangan tentukan nilai untuk pseudo-kolom
_partitiontime.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);Contoh 2
Saat memasukkan data, Anda dapat menentukan nilai untuk pseudo-kolom
_partitiontime. Granularitas waktu nilai_partitiontimeharus sesuai dengan granularitas partisi yang ditentukan, yaitu `hour`.Contoh valid: Tentukan
'2025-06-15 14:00:00'sebagai nilai kolom_partitiontime.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');Contoh tidak valid: Tentukan
'2025-06-15 14:30:00'sebagai nilai kolom_partitiontime. Nilai ini tidak sesuai dengan granularitas partisi per jam.INSERT INTO ingestion_sale_detail_hourly (shop_name,total_price,_partitiontime) VALUES ('beijing_shop',50005.5,TIMESTAMP '2025-06-15 14:30:00');Pesan error berikut dikembalikan:
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
Contoh 3
Saat granularitas partisi per hari, Anda hanya dapat menentukan nilai untuk pseudo-kolom
_partitiontime. Anda tidak dapat menentukan nilai untuk pseudo-kolom_partitiondate.Contoh valid: Tentukan
'2025-06-18 00:00:00'sebagai nilai kolom_partitiontime.INSERT INTO ingestion_sale_detail_daily (shop_name,total_price,_partitiontime) VALUES ('beijing_shop',50005.5,TIMESTAMP '2025-06-18 00:00:00');Contoh tidak valid:
Tentukan
'2025-06-15 14:00:00'sebagai nilai kolom_partitiontime. Nilai ini tidak sesuai dengan granularitas partisi per hari.INSERT INTO ingestion_sale_detail_daily (shop_name,total_price,_partitiontime) VALUES ('beijing_shop',50005.5,TIMESTAMP '2025-06-18 14:00:00');Pesan error berikut dikembalikan:
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:00Langsung tentukan nilai untuk pseudo-kolom
_partitiondate.INSERT INTO ingestion_sale_detail_daily (shop_name,total_price,_partitiondate) VALUES ('beijing_shop',50005.5,DATE '2025-06-15');Pesan error berikut dikembalikan:
FAILED: ODPS-0130071:[1,64] Semantic analysis exception - column _partitiondate cannot be resolved; Did you mean _partitiontime ?
Kueri tabel partisi berdasarkan waktu pemasukan data
Saat menjalankan kueri
SELECT *, sistem tidak mengembalikan pseudo-kolom_partitiontimeatau_partitiondatemaupun kolom kunci partisi yang dihasilkan secara default. Untuk menampilkan kolom-kolom tersebut, Anda harus menentukannya secara eksplisit dalam pernyataan, misalnya,SELECT *, _partitiontime FROM xxx;.Untuk tabel yang dipartisi per jam, bulan, atau tahun, Anda dapat menggunakan pseudo-kolom
_partitiontimeuntuk pemfilteran kueri dan Pemangkasan partisi. Tabel partisi berdasarkan waktu pemasukan data merupakan jenis khusus tabel auto-partisi dan mendukung kemampuan Pemangkasan partisi yang sama seperti tabel auto-partisi standar. Untuk informasi selengkapnya, lihat Tabel auto-partisi berdasarkan fungsi waktu.
Contoh:
Contoh-contoh berikut menunjukkan cara mengkueri data dari tabel ingestion_sale_detail_hourly dan ingestion_sale_detail_daily yang dibuat di bagian Contoh.
Contoh 1
Saat menjalankan kueri
SELECT *, sistem tidak mengembalikan pseudo-kolom_partitiontimeatau_partitiondatemaupun kolom kunci partisi yang dihasilkan secara default.SELECT * FROM ingestion_sale_detail_hourly; -- Hasil dikembalikan. +------------+-------------+ | 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 | +---------------+-------------+Contoh 2
Anda dapat menentukan pseudo-kolom
_partitiontimeatau_partitiondateserta kolom kunci partisi yang dihasilkan dalam kueri Anda. Pada contoh ini,sale_timedansale_dateadalah nama kolom kunci partisi yang ditentukan saat tabel dibuat.CatatanPada contoh ini, zona waktu lokal proyek diatur ke `Asia/Shanghai` (UTC+8) dengan menjalankan perintah
set odps.sql.timezone=Asia/Shanghai;. Zona waktu memengaruhi nilai partisi yang dihasilkan oleh fungsi `TRUNC_TIME`.Kueri tabel
ingestion_sale_detail_hourly, yang dipartisi per jam.SELECT * ,_partitiontime,sale_time FROM ingestion_sale_detail_hourly; --Hasil berikut dikembalikan: +---------------+-------------+---------------------+---------------------+ | 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 | +---------------+-------------+---------------------+---------------------+Kueri tabel
ingestion_sale_detail_daily, yang dipartisi per hari.SELECT * ,_partitiontime,_partitiondate,sale_date FROM ingestion_sale_detail_daily; --Hasil berikut dikembalikan: +--------------+-------------+---------------------+----------------+-----------+ | shop_name | total_price | _partitiontime | _partitiondate | sale_date | +--------------+-------------+---------------------+----------------+-----------+ | beijing_shop | 50005.5 | 2025-06-18 00:00:00 | 2025-06-18 | 2025-06-18| +--------------+-------------+---------------------+----------------+-----------+