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 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_detailyang mencakup kolom data waktu bertipe TIMESTAMPsale_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_detailyang 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 pernyataanDESC 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 | | +------------------------------------------------------------------------------------+CatatanUntuk 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 eksplisitsale_dateberdasarkan 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);PentingSintaksis 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 |
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;. Kolomsale_dateadalah 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.
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 |
Pemangkasan partisi didukung ketika granularitas pemotongan waktu sama dengan dalam pernyataan pembuatan tabel. | |
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. |
Pemangkasan partisi didukung ketika granularitas pemotongan untuk pembuatan partisi dalam pembuatan tabel adalah hari. |
Contoh 1: Saat Anda memfilter kolom waktu
sale_timemenggunakan 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_timemenggunakan 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 | +------------+-------------+------------+