全部产品
Search
文档中心

MaxCompute:Tabel partisi berdasarkan waktu pemasukan data

更新时间:Dec 17, 2025

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 _partitiontime dan menghasilkan kolom kunci partisi.

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 _pt_col_0_ sebagai nama default. Jika kolom dengan nama tersebut sudah ada, sistem menambahkan angka pada akhir nama, seperti _pt_col_1_ dan _pt_col_2_, hingga menemukan nama yang tersedia.

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_hourly yang dipartisi per jam. Definisi tabel menentukan pseudo-kolom bernama _partitiontime bertipe TIMESTAMP. Saat data ditulis ke tabel, sistem secara otomatis mendapatkan waktu pemasukan data, lalu mengisi pseudo-kolom _partitiontime berdasarkan granularitas per jam yang ditentukan dalam pernyataan DDL. Nilai kolom kunci partisi sale_time kemudian 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_hourly yang dibuat pada contoh di atas berisi empat kolom. Kolom sale_time adalah kolom kunci partisi yang dihasilkan secara otomatis bertipe STRING. Anda dapat menjalankan pernyataan DESC 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_daily yang dipartisi per hari. Jika granularitas partisi per hari, pseudo-kolom tambahan bernama _partitiondate bertipe 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');
    Catatan
    • Anda 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:

Catatan

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 _partitiontime harus 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:00
      • Langsung 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 _partitiontime atau _partitiondate maupun 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 _partitiontime untuk 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:

Catatan

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 _partitiontime atau _partitiondate maupun 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 _partitiontime atau _partitiondate serta kolom kunci partisi yang dihasilkan dalam kueri Anda. Pada contoh ini, sale_time dan sale_date adalah nama kolom kunci partisi yang ditentukan saat tabel dibuat.

    Catatan

    Pada 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|
      +--------------+-------------+---------------------+----------------+-----------+