全部产品
Search
文档中心

MaxCompute:Tabel partisi otomatis berdasarkan fungsi komputasi waktu

更新时间:Dec 17, 2025

MaxCompute mendukung tabel partisi otomatis (AUTO PARTITION). Kolom partisi dari tabel ini dapat dihasilkan secara otomatis berdasarkan fungsi komputasi waktu atau waktu penulisan data. Topik ini menjelaskan cara menggunakan tabel partisi otomatis yang dihasilkan berdasarkan fungsi komputasi waktu.

Pengantar

MaxCompute mendukung dua jenis tabel partisi: tabel partisi reguler dan tabel partisi otomatis (AUTO PARTITION). Anda dapat memilih jenis tabel berdasarkan cara menghasilkan kolom partisi untuk skenario yang berbeda. Untuk informasi selengkapnya, lihat Ikhtisar tabel partisi.

Dibandingkan dengan produk big data lainnya yang mendukung partisi berdasarkan kolom tipe tanggal/waktu atau setelah pemotongan kolom tersebut, MaxCompute menawarkan kemampuan partisi yang lebih fleksibel. MaxCompute mendukung penggunaan fungsi komputasi waktu tertentu pada kolom data bertipe waktu/tanggal (DATE, DATETIME, TIMESTAMP, TIMESTAMP_NTZ) untuk menghasilkan nilai kolom partisi secara otomatis berdasarkan hasil perhitungan kolom data, sehingga menerapkan partisi tabel.

Selain itu, MaxCompute mendukung pengambilan otomatis waktu saat data ditulis, dikombinasikan dengan fungsi komputasi waktu yang ditentukan pengguna, untuk menghasilkan nilai kolom partisi berdasarkan hasil perhitungan guna melakukan partisi tabel. Untuk informasi selengkapnya, lihat Tabel partisi otomatis berdasarkan waktu penulisan data.

Batasan

  • Tabel partisi otomatis berdasarkan fungsi komputasi waktu saat ini hanya mendukung satu kolom partisi dan tidak mendukung partisi multi-level.

  • Kolom partisi tabel partisi otomatis berdasarkan fungsi komputasi waktu dihasilkan secara otomatis sesuai dengan ekspresi pembuatan partisi yang ditentukan saat tabel dibuat. Tipe bidang partisi adalah STRING secara default dan tidak dapat diubah.

  • Partisi otomatis berdasarkan fungsi waktu atau waktu penulisan data hanya didukung ketika Anda menulis data menggunakan MaxCompute SQL. Fitur ini tidak didukung untuk metode penulisan data lainnya, seperti menggunakan konektor Flink.

Catatan penggunaan

Buat tabel partisi otomatis berdasarkan fungsi komputasi waktu

Sintaksis

Buat tabel partisi otomatis berdasarkan fungsi komputasi waktu.

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

Parameter

Parameter

Wajib

Deskripsi

table_name

Ya

Nama tabel yang akan dibuat.

col_name

Ya

Nama kolom.

data_type

Ya

Tipe data kolom.

table_comment

Tidak

Komentar tabel.

auto_partition_expression

Ya

Ekspresi yang mendefinisikan cara menghitung kolom partisi. Saat ini, hanya fungsi TRUNC_TIME yang didukung untuk menghasilkan perhitungan kolom partisi.

Catatan

Saat membuat tabel partisi otomatis berdasarkan waktu penulisan data, sistem secara otomatis memperoleh waktu penulisan data dan memotongnya menggunakan fungsi TRUNC_TIME untuk menghasilkan nilai kolom partisi.

auto_partition_column_name

Tidak

Nama kolom partisi yang dihasilkan. Jika nama kolom partisi tidak ditentukan, sistem menggunakan _pt_col_0_ sebagai nama kolom default dan memeriksa apakah nama kolom ini sudah ada di dalam tabel. Jika sudah ada, akhiran akan dinaikkan secara otomatis (seperti _pt_col_1_, _pt_col_2_, dll.) hingga ditemukan nama kolom yang belum digunakan.

Catatan

Setelah melakukan partisi menggunakan ekspresi partisi, kolom partisi bertipe STRING dihasilkan berdasarkan hasil perhitungan. Tipe kolom dan nilai kolom tidak mendukung operasi langsung.

Contoh

  • Contoh 1: Potong data kolom tipe waktu/tanggal per hari untuk menghitung dan menghasilkan partisi otomatis.

    Buat tabel partisi otomatis sale_detail yang mencakup kolom data waktu bertipe TIMESTAMP sale_time. Dalam pernyataan DDL, potong kolom data ini per hari, dan hasilkan partisi tabel AUTO PARTITION berdasarkan hasil perhitungan.

    CREATE TABLE IF NOT EXISTS sale_detail(
     shop_name     STRING,
     total_price   DOUBLE,
     sale_time    TIMESTAMP )
    AUTO PARTITIONED BY (TRUNC_TIME(sale_time, 'day'));

    Tabel partisi otomatis sale_detail yang dibuat oleh pernyataan tersebut berisi empat kolom: shop_name, total_price, sale_time, dan _pt_col_0_. Kolom _pt_col_0_ adalah kolom partisi yang dihasilkan secara otomatis dengan tipe data STRING. Anda dapat menjalankan pernyataan DESC sale_detail; untuk melihat informasi tabel. Berikut contoh hasilnya:

    +------------------------------------------------------------------------------------+
    | Pemilik:                    ALIYUN$***                             |
    | Proyek:                  ***                                    |
    | KomentarTabel:                                                                      |
    +------------------------------------------------------------------------------------+
    | WaktuPembuatan:               2025-06-26 11:21:55                                      |
    | WaktuDDLTerakhir:              2025-06-26 11:21:55                                      |
    | WaktuModifikasiTerakhir:         2025-06-26 11:21:55                                      |
    +------------------------------------------------------------------------------------+
    | InternalTable: YA      | Ukuran: 0                                                  |
    +------------------------------------------------------------------------------------+
    | Kolom Asli:                                                                    |
    +------------------------------------------------------------------------------------+
    | Bidang           | Tipe       | Label | Komentar                                     |
    +------------------------------------------------------------------------------------+
    | shop_name       | string     |       |                                             |
    | total_price     | double     |       |                                             |
    | sale_time       | timestamp  |       |                                             |
    +------------------------------------------------------------------------------------+
    | Kolom Partisi:                                                                 |
    +------------------------------------------------------------------------------------+
    | _pt_col_0_      | string     |                                                     |
    +------------------------------------------------------------------------------------+
    Catatan

    Untuk melihat logika perhitungan pembuatan partisi kolom AUTO PARTITION, Anda dapat menggunakan SHOW CREATE TABLE.

  • Contoh 2: Tentukan secara eksplisit nama kolom partisi yang dihasilkan.

    Buat tabel partisi otomatis sale_detail2, menambahkan nama kolom partisi yang ditentukan secara eksplisit sale_date berdasarkan Contoh 1.

    CREATE TABLE IF NOT EXISTS sale_detail2(
     shop_name     STRING,
     total_price   DOUBLE,
     sale_time    TIMESTAMP )
    AUTO PARTITIONED BY (TRUNC_TIME(sale_time, 'day') AS sale_date);
  • Contoh 3: Jika kolom data masukan fungsi TRUNC_TIME bertipe DATE dan dipartisi berdasarkan hari, sintaksis sederhana berikut didukung.

    CREATE TABLE IF NOT EXISTS sale_detail3(
     shop_name     STRING,
     total_price   DOUBLE,
     sale_date    DATE )
    AUTO PARTITIONED BY (TRUNC_TIME(sale_date , 'day'));
    
    -- Pernyataan SQL di atas dapat disederhanakan menjadi
    CREATE TABLE IF NOT EXISTS sale_detail3(
     shop_name     STRING,
     total_price   DOUBLE,
     sale_date    DATE )
    AUTO PARTITIONED BY (sale_date);
    Penting

    Sintaksis sederhana ini hanya mendukung tipe data DATE, bukan tipe data DATETIME/TIMESTAMP/TIMESTAMP_NTZ.

Tulis data ke tabel partisi otomatis berdasarkan fungsi komputasi waktu

Saat pengguna menggunakan Pernyataan SQL untuk menulis data ke tabel AUTO PARTITION, sistem secara otomatis menghasilkan ekspresi perhitungan berdasarkan definisi partisi yang ditentukan saat pembuatan tabel, lalu menentukan nilai partisi yang sesuai berdasarkan data dalam tabel. Pengguna tidak dapat menentukan nilai partisi secara eksplisit.

Contoh: Tulis data ke tabel partisi sale_detail2 yang dibuat berdasarkan fungsi komputasi waktu.

-- Atur zona waktu lokal proyek ke Zona Waktu Timur Delapan.
set odps.sql.timezone=Asia/Shanghai;

-- Sama seperti metode pembuatan tabel partisi sale_detail2 di atas.
CREATE TABLE IF NOT EXISTS sale_detail2(
 shop_name     STRING,
 total_price   DOUBLE,
 sale_time    TIMESTAMP )
AUTO PARTITIONED BY (TRUNC_TIME(sale_time, 'day') AS sale_date);


INSERT INTO sale_detail2 VALUES
  ('chongqin_shop',101101,timestamp '2025-02-04 01:15:30'),
  ('shenzhen_shop',202202,timestamp '2024-03-29 15:30:30'),
  ('hangzhou_shop',303303,timestamp '2025-02-04 08:30:30'),
  ('shanghai_shop',404404,timestamp '2025-02-28 01:50:30');
  

Dalam contoh ini, korespondensi antara nilai kolom data waktu sale_time dan nilai partisi yang dihasilkan setelah perhitungan TRUNC_TIME adalah sebagai berikut:

Kolom sale_time - Zona waktu Asia/Shanghai

Nilai kolom partisi sale_date (dihasilkan setelah pemotongan kolom waktu per hari, mewakili waktu UTC)

2025-02-04 01:15:30

2025-02-03

2024-03-29 15:30:30

2024-03-29

2025-02-04 08:30:30

2025-02-04

2025-02-28 01:50:30

2025-02-27

Catatan
  • Perhatikan bahwa untuk tipe data terkait zona waktu seperti DATETIME/TIMESTAMP, TRUNC_TIME mengonversi waktu lokal ke waktu UTC sebelum pemotongan.

  • Dalam contoh ini, zona waktu lokal proyek diatur ke Zona Waktu Timur Delapan menggunakan set odps.sql.timezone=Asia/Shanghai;. Zona waktu memengaruhi nilai partisi yang dihasilkan oleh pemotongan TRUNC_TIME.

Kueri tabel partisi otomatis berdasarkan fungsi komputasi waktu

  • Contoh 1: Saat mengeksekusi kueri select * , kolom partisi yang dihasilkan tidak ditampilkan secara default.

    -- Aktifkan pemindaian tabel penuh 
    set odps.sql.allow.fullscan=true;
    
    SELECT * FROM sale_detail2;
    
    -- Hasil
    +------------+-------------+------------+
    | shop_name  | total_price | sale_time  | 
    +------------+-------------+------------+
    | hangzhou_shop | 303303.0    | 2025-02-04 08:30:30 | 
    | shanghai_shop | 404404.0    | 2025-02-28 01:50:30 | 
    | shenzhen_shop | 202202.0    | 2024-03-29 15:30:30 | 
    | chongqin_shop | 101101.0    | 2025-02-04 01:15:30 | 
    +------------+-------------+------------+
  • Contoh 2: Untuk menampilkan kolom partisi yang dihasilkan dalam output, jalankan SELECT *,sale_date from sale_detail2;. Kolom sale_date adalah nama kolom partisi yang ditentukan saat tabel dibuat.

    SELECT *,sale_date from sale_detail2;
    
    -- Hasil
    +------------+-------------+------------+------------+
    | shop_name  | total_price | sale_time  | sale_date  | 
    +------------+-------------+------------+------------+
    | shanghai_shop | 404404.0    | 2025-02-28 01:50:30 | 2025-02-27 | 
    | hangzhou_shop | 303303.0    | 2025-02-04 08:30:30 | 2025-02-04 | 
    | shenzhen_shop | 202202.0    | 2024-03-29 15:30:30 | 2024-03-29 | 
    | chongqin_shop | 101101.0    | 2025-02-04 01:15:30 | 2025-02-03 | 
    +------------+-------------+------------+------------+

Pemangkasan partisi untuk tabel partisi otomatis berdasarkan fungsi komputasi waktu

Saat menanyakan tabel partisi otomatis, pemangkasan partisi hanya didukung dalam skenario berikut.

Catatan

Anda dapat memeriksa rencana eksekusi SQL di Logview atau menggunakan perintah EXPLAIN untuk menentukan apakah pemangkasan partisi berjalan. Untuk informasi selengkapnya, lihat Evaluasi efektivitas pemangkasan partisi.

Skenario 1: Menggunakan kolom partisi yang dihasilkan sebagai kondisi filter, pemangkasan partisi didukung selama eksekusi kueri.

Untuk tabel sale_detail2, Anda dapat memfilter data melalui kolom partisi yang dihasilkan sale_date saat menanyakan. Dengan menggunakan kondisi filter WHERE sale_date > '2025-02-03';, hanya partisi yang memenuhi kondisi filter sale_date > '2025-02-03' yang dipindai.

SELECT * FROM sale_detail2 WHERE sale_date > '2025-02-03';

-- Hasil
+------------+-------------+------------+
| shop_name  | total_price | sale_time  | 
+------------+-------------+------------+
| shanghai_shop | 404404.0    | 2025-02-28 01:50:30 | 
| hangzhou_shop | 303303.0    | 2025-02-04 08:30:30 | 
+------------+-------------+------------+

Skenario 2: Menggunakan kolom data waktu/tanggal yang menghasilkan kolom partisi (tanpa menerapkan fungsi ke kolom ini) sebagai kondisi filter, pemangkasan partisi didukung selama eksekusi kueri.

Untuk tabel sale_detail2, Anda dapat memfilter data melalui kolom data waktu sale_time dalam tabel. Dengan menggunakan kondisi filter WHERE sale_time > '2025-02-04 08:00:00';, sistem menentukan data partisi mana yang memenuhi kondisi pemindaian untuk sale_time dan hanya memindai partisi yang sesuai dengan kondisi tersebut.

SELECT * FROM sale_detail2 WHERE sale_time > '2025-02-04 08:00:00';

-- Hasil
+------------+-------------+------------+
| shop_name  | total_price | sale_time  | 
+------------+-------------+------------+
| shanghai_shop | 404404.0    | 2025-02-28 01:50:30 | 
| hangzhou_shop | 303303.0    | 2025-02-04 08:30:30 | 
+------------+-------------+------------+

Skenario 3: Menerapkan perhitungan fungsi pada kolom data bertipe waktu/tanggal yang digunakan untuk menghasilkan kolom partisi saat membuat tabel, dan menggunakan hasil perhitungan sebagai kondisi filter. Saat ini, pemangkasan partisi didukung dalam beberapa skenario perhitungan fungsi.

Fungsi yang mendukung pemangkasan partisi

Kondisi untuk pemangkasan partisi berlaku

TRUNC_TIME

Pemangkasan partisi didukung ketika granularitas pemotongan waktu sama dengan dalam pernyataan pembuatan tabel.

DATETRUNC

Pemangkasan partisi didukung ketika granularitas pemotongan waktu sama dengan dalam pernyataan pembuatan tabel.

CAST AS DATE

Pemangkasan partisi didukung ketika granularitas pemotongan untuk pembuatan partisi dalam pembuatan tabel adalah hari.

TO_DATE

Pemangkasan partisi didukung ketika granularitas pemotongan untuk pembuatan partisi dalam pembuatan tabel adalah hari.

  • Contoh 1: Saat Anda memfilter kolom waktu sale_time menggunakan fungsi TRUNC_TIME atau fungsi DATETRUNC tanpa parameter zona waktu, dan granularitas pemotongan waktu sama dengan yang digunakan dalam pernyataan pembuatan tabel, pemangkasan partisi berlaku.

    SELECT * FROM sale_detail2 WHERE TRUNC_TIME(sale_time, 'day') > '2025-02-04';
    
    SELECT * FROM sale_detail2 WHERE DATETRUNC(sale_time, 'dd') > '2025-02-04 00:00:00';
    
    -- Hasil
    +------------+-------------+------------+
    | shop_name  | total_price | sale_time  | 
    +------------+-------------+------------+
    | shanghai_shop | 404404.0    | 2025-02-28 01:50:30 | 
    +------------+-------------+------------+
  • Contoh 2: Pemangkasan partisi berlaku jika Anda memfilter kolom sale_time menggunakan CAST AS DATE atau fungsi TO_DATE tanpa parameter zona waktu. Agar berfungsi, granularitas pemotongan yang ditentukan saat tabel dibuat harus `day`.

    SELECT * FROM sale_detail2 WHERE CAST(sale_time AS date) = '2025-02-04';
    
    SELECT * FROM sale_detail2 WHERE TO_DATE(sale_time) = '2025-02-04';
    -- Hasil
    +------------+-------------+------------+
    | shop_name  | total_price | sale_time  | 
    +------------+-------------+------------+
    | hangzhou_shop | 303303.0    | 2025-02-04 08:30:30 | 
    +------------+-------------+------------+