Dalam MaxCompute, Anda dapat menjalankan kueri perjalanan waktu dan kueri tambahan pada tabel Delta. Untuk kueri perjalanan waktu, Anda dapat mengakses data historis berdasarkan snapshot dari tabel sumber pada titik waktu atau versi tertentu. Untuk kueri tambahan, Anda dapat mengakses data tambahan historis dalam rentang waktu atau antara dua versi tabel sumber. Topik ini menjelaskan catatan penggunaan dan batasan kueri pada tabel Delta.
Sintaksis
[WITH <cte>[, ...] ]
SELECT [ALL | DISTINCT] <select_expr>[, <except_expr>)][, <replace_expr>] ...
FROM <table_reference>
[TIMESTAMP | VERSION AS OF expr]
[TIMESTAMP | VERSION BETWEEN start_expr AND end_expr]
[WHERE <where_condition>]
[GROUP BY {<col_list> | ROLLUP(<col_list>)}]
[HAVING <having_condition>]
[ORDER BY <order_condition>]
[DISTRIBUTE BY <distribute_condition> [SORT BY <sort_condition>]|[ CLUSTER BY <cluster_condition>] ]
[LIMIT <number>]
[WINDOW <window_clause>]Pada umumnya, Anda dapat mengeksekusi pernyataan Data Query Language (DQL) untuk mengakses tabel Delta di semua skenario. Sintaksis dan batasan DQL secara umum mengikuti aturan sintaksis dan batasan DQL MaxCompute. Perbedaan utamanya adalah optimasi klausa FROM TABLE dalam pernyataan DQL. Klausa FROM TABLE yang dioptimalkan menyediakan ekspresi format tetap yang memungkinkan Anda menentukan titik waktu atau versi historis untuk kueri perjalanan waktu, serta rentang waktu atau versi untuk kueri tambahan.
Parameter dan batasan kueri perjalanan waktu
Untuk kueri perjalanan waktu pada tabel Delta, Anda dapat mengakses data historis berdasarkan snapshot tabel sumber pada titik waktu atau versi tertentu. Gunakan sintaksis [TIMESTAMP | VERSION AS OF expr] untuk mengonfigurasi kueri perjalanan waktu.
TIMESTAMP AS OF expr
Parameter
TIMESTAMP AS OF: Format sintaksis tetap, diikuti oleh titik waktu historis. Data historis sebelum titik waktu tersebut diakses berdasarkan snapshot.expr: Nilai tipe TIMESTAMP, DATETIME, atau DATE yang didukung oleh MaxCompute. Nilai tersebut dapat berupa salah satu format berikut:Konstanta string tanggal:
Tabel berikut memberikan contoh konstanta string untuk tipe TIMESTAMP, DATETIME, atau DATE.
Tipe data
Contoh
TIMESTAMP
'2023-01-01 00:00:00.123'DATETIME
'2023-01-01 00:00:00'DATE
'2023-01-01'Fungsi waktu bawaan MaxCompute:
current_timestamp(),getDate() + N: current_timestamp(), dangetDate().Pada fungsi-fungsi tersebut, N dinyatakan dalam detik. Jika N bernilai negatif, waktu yang ditentukan adalah N detik sebelum waktu saat ini. Jika N bernilai positif, waktu yang ditentukan adalah N detik setelah waktu saat ini.
Sintaksis untuk tabel Delta:
get_latest_timestamp(string tablename [, bigint <number>]).Untuk akses lintas proyek, nilai parameter
tablenameharus diformat sebagaiProjectName.TableName.Untuk model tiga lapis, nilai parameter
tablenameharus diformat sebagaiProjectName.SchemaName.TableName.Parameter
numberbersifat opsional dengan nilai default 1. Parameter ini menentukan nomor urutan operasi data dalam urutan kronologis terbalik. Misalnya, untuk mendapatkan waktu ketika operasi data terakhir dikomit, atur parameter ini ke 1. Operasi data mencakup modifikasi data yang diinisiasi oleh pengguna dan pengurutan serta distribusi data yang diinisiasi oleh sistem. TIMESTAMP yang dikembalikan mungkin sama meskipun parameter number diatur ke nilai yang berbeda.
Batasan
Rentang kueri untuk data snapshot historis adalah
[CreateTableTimestamp, expr]. Parameter expr menentukan waktu ketika operasi DML dikomit, sedangkan CreateTableTimestamp menentukan waktu pembuatan tabel.Jika waktu yang ditentukan oleh parameter
exprlebih dari N jam yang lalu atau lebih awal dari waktu pembuatan tabel Delta, kesalahan akan dikembalikan karena data historis tertentu mungkin tidak tersedia. N ditentukan oleh parameteracid.data.retain.hoursyang dikonfigurasikan selama pembuatan tabel. Sebagai contoh, jika acid.data.retain.hours diatur ke 72, dan expr diatur ke waktu lebih dari 72 jam yang lalu, kesalahan akan dikembalikan.Jika waktu yang ditentukan oleh parameter
expradalah N jam yang lalu, kesalahan mungkin terjadi. N ditentukan oleh parameteracid.data.retain.hoursyang dikonfigurasikan selama pembuatan tabel. Hal ini disebabkan oleh latensi tingkat detik dalam interaksi sistem internal. Oleh karena itu, hindari menggunakan sintaksis sepertiTIMESTAMP AS OF current_timestamp() - periode perjalanan waktu.
VERSION AS OF expr
Parameter
VERSION AS OF: Format sintaksis tetap, diikuti oleh versi operasi data historis. Data historis sebelum versi tersebut diakses berdasarkan snapshot.expr: Nilai tipe BIGINT yang didukung oleh MaxCompute. Nilai tersebut mendukung format berikut:Konstanta tipe BIGINT:
Contohnya, konstanta
3.Sintaksis untuk tabel Delta:
get_latest_version(string tablename [, bigint <number>]).Untuk akses lintas proyek, nilai parameter
tablenameharus diformat sebagaiProjectName.TableName.Untuk model tiga lapis, nilai parameter
tablenameharus diformat sebagaiProjectName.SchemaName.TableName.Parameter
numberbersifat opsional dengan nilai default 1. Parameter ini menentukan nomor urutan operasi data dalam urutan kronologis terbalik. VersiVERSIONyang dikembalikan bervariasi sesuai dengan nilai parameter number.
Batasan
Setiap operasi DML menghasilkan nomor versi yang meningkat secara ketat. Gunakan
SHOW HISTORY FOR TABLE/PARTITIONuntuk melihat informasi operasi DML dan mendapatkan versi yang sesuai.Rentang waktu historis untuk kueri perjalanan waktu adalah
[CreateTableVersion, expr]. Parameter expr menentukan versi operasi DML. ParameterCreateTableVersionmenentukan versi operasi pembuatan tabel. Nilai defaultnya adalah 1.Sistem mendapatkan waktu ketika operasi DML dikomit berdasarkan versi yang ditentukan oleh parameter expr. Jika waktu tersebut lebih dari N jam yang lalu atau versinya kurang dari 1, kesalahan akan dikembalikan. N ditentukan oleh parameter
acid.data.retain.hoursyang dikonfigurasikan selama pembuatan tabel.Jika versi yang ditentukan oleh parameter expr lebih baru daripada versi operasi DML terakhir, kesalahan akan dikembalikan. Disarankan untuk mendapatkan versi menggunakan fungsi
get_latest_version.
Parameter dan batasan kueri tambahan
Hanya tabel Delta yang mendukung kueri tambahan. Untuk kueri tambahan, Anda dapat mengakses data tambahan historis dalam rentang waktu atau antara dua versi tabel sumber. Gunakan sintaksis [TIMESTAMP | VERSION BETWEEN start_expr AND end_expr] untuk mengonfigurasi kueri tambahan.
TIMESTAMP BETWEEN start_expr AND end_expr
Parameter
TIMESTAMP BETWEEN AND: Format sintaksis tetap, yang menentukan rentang waktu historis. Data tambahan historis dalam rentang waktu tersebut diakses.start_exprdanend_expr: Penggunaan dan batasan kedua parameter ini konsisten dengan parameterEXPRdalam sintaksisTIMESTAMP AS OF.
Batasan
Rentang waktu yang ditentukan oleh
(start_expr, end_expr]adalah interval terbuka-kiri, tertutup-kanan. Parameter start_expr dan end_expr menentukan waktu ketika operasi DML dikomit.Jika waktu yang ditentukan oleh parameter
start_exprlebih dari N jam yang lalu atau lebih awal dari waktu pembuatan tabel, kesalahan akan dikembalikan. N ditentukan oleh parameteracid.data.retain.hours.Jika waktu yang ditentukan oleh parameter
end_exprlebih baru daripada waktu ketika operasi DML terakhir dikomit, hasil kueri bergantung pada nilai parameteracid.incremental.query.out.of.time.range.enabled:Jika parameter ini diatur ke nilai default false, kesalahan akan dikembalikan.
Jika parameter ini diatur ke true, semua data tambahan historis dalam rentang waktu yang ditentukan oleh
(start_expr,end_expr]dikembalikan.Anda dapat mengeksekusi pernyataan
ALTER TABLEuntuk memodifikasi nilai parameter ini. Contoh pernyataan:ALTER TABLE mf_tt2 SET tblproperties("acid.incremental.query.out.of.time.range.enabled"="true");
VERSION BETWEEN start_expr AND end_expr
Parameter
VERSION BETWEEN AND: Format sintaksis tetap, yang menentukan rentang versi operasi DML historis. Data tambahan historis dalam rentang versi tersebut dikembalikan.start_exprdanend_expr: Penggunaan dan batasan kedua parameter ini konsisten dengan parameterexprdalam sintaksisVERSION AS OF.
Batasan
Rentang versi yang ditentukan oleh (start_expr, end_expr] adalah interval terbuka-kiri, tertutup-kanan. Parameter start_expr dan end_expr menentukan versi operasi DML.
Sistem mendapatkan waktu ketika operasi DML dikomit berdasarkan versi yang ditentukan oleh parameter
start_expr. Jika waktu tersebut lebih dari N jam yang lalu atau versinya kurang dari 1, kesalahan akan dikembalikan. N ditentukan oleh parameteracid.data.retain.hoursyang dikonfigurasikan untuk kueri perjalanan waktu.Jika versi yang ditentukan oleh parameter
end_exprlebih baru daripada versi operasi DML terakhir, hasil kueri akan bervariasi berdasarkan nilai parameteracid.incremental.query.out.of.time.range.enabled. Jika parameter ini disetel ke nilai default false, kesalahan akan dikembalikan. Namun, jika diatur ke true, semua data historis tambahan yang dihasilkan dalam rentang versi (start_expr, end_expr] akan dikembalikan.
Lainnya
Jika beberapa baris rekaman dengan kunci yang sama diakses, hanya baris terbaru yang dikembalikan. Jika baris terbaru berada dalam status DELETE, baris tersebut disaring. Fitur untuk mengakses status pembaruan data dalam format serupa Change Data Capture (CDC) direncanakan akan disediakan di masa mendatang.
Anda tidak dapat mengakses tabel historis yang tidak ada. Sebagai contoh, setelah menjalankan operasi drop atau rename pada tabel, Anda tidak dapat mengakses data historis dari tabel aslinya.
Jika ingin mengakses data historis dalam jenis tabel ini, Anda dapat memulihkan tabel dan kemudian melakukan kueri.
Hanya tabel Delta yang mendukung kueri perjalanan waktu dan kueri tambahan.
Jika ingin menjalankan kueri perjalanan waktu atau kueri tambahan pada tabel yang sama dalam pernyataan SQL, Anda harus mengatur timestamp atau versi untuk kueri ke nilai yang sama.
Jika ingin menjalankan kueri pada tabel yang dipartisi, disarankan untuk menentukan partisi untuk kueri. Dengan cara ini, hanya partisi yang ditentukan yang dikueri, sehingga menghemat waktu.
Model Multiversion Concurrency Control (MVCC) digunakan untuk transaksi baca dan tulis bersamaan. Hal ini memastikan bahwa operasi baca dan tulis diisolasi dan tidak saling memengaruhi. Tingkat ReadCommitted didukung.
Data yang dihasilkan oleh operasi kompaksi tidak dianggap sebagai data baru. Oleh karena itu, jenis data ini tidak dikembalikan ketika Anda menjalankan kueri tambahan.
Contoh
Data contoh.
-- Versi operasi pembuatan tabel berikut adalah 1. Anda dapat mengeksekusi show history for table mf_tt2 untuk menanyakan versi; CREATE TABLE mf_tt2 ( pk bigint NOT NULL PRIMARY KEY, val bigint NOT NULL) PARTITIONED BY (dd string, hh string) tblproperties ("transactional"="true"); -- Versi operasi DML berikut adalah 2 INSERT OVERWRITE TABLE mf_tt2 PARTITION (dd='01', hh='01') VALUES (1, 1), (2, 2), (3, 3); -- Versi operasi DML berikut adalah 3 INSERT INTO TABLE mf_tt2 PARTITION (dd='01', hh='01') VALUES (3, 30), (4, 4), (5, 5);Mengakses data tabel.
Mengakses waktu pembuatan tabel, yang digunakan sebagai referensi ketika menentukan titik waktu historis.
DESC EXTENDED mf_tt2;Hasil berikut dikembalikan.
+------------------------------------------------------------------------------------+ | Owner: ALIYUN$****_doctest@test.aliyunid.com | Project: doc_test_prod | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2023-06-26 09:31:38 | | LastDDLTime: 2023-06-26 09:31:38 | | LastModifiedTime: 2023-06-26 09:32:31 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 8541 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | ExtendedLabel | Nullable | DefaultValue | Comment | +------------------------------------------------------------------------------------+ | pk | bigint | | | false | NULL | | | val | bigint | | | false | NULL | | +------------------------------------------------------------------------------------+ | Partition Columns: | +------------------------------------------------------------------------------------+ | dd | string | | | hh | string | | +------------------------------------------------------------------------------------+ | Extended Info: | +------------------------------------------------------------------------------------+ | TableID: bec515a56cc9492c8f906a224c62**** | | IsArchived: false | | PhysicalSize: 25623 | | FileNum: 9 | | StoredAs: AliOrc | | CompressionStrategy: normal | | ClusterType: hash | | BucketNum: 16 | | ClusterColumns: [pk] | | SortColumns: [pk ASC] | +------------------------------------------------------------------------------------+Mengakses versi operasi data historis.
SHOW HISTORY FOR TABLE mf_tt2 PARTITION (dd='01',hh='01');Hasil berikut dikembalikan.
ID = 20230626021756157ghict5k**** ObjectType ObjectId ObjectName VERSION(LSN) Time Operation PARTITION 4764c8e1cb634a4fb9c21f3fc850**** dd=01/hh=01 0000000000000002 2023-06-26 09:31:56 CREATE PARTITION 4764c8e1cb634a4fb9c21f3fc850**** dd=01/hh=01 0000000000000003 2023-06-26 09:32:32 APPEND
Contoh kueri perjalanan waktu.
Mengakses semua data historis yang disimpan sebelum titik waktu tertentu, seperti waktu yang ditentukan oleh konstanta string tipe DATETIME.
SELECT * FROM mf_tt2 TIMESTAMP AS OF '2023-06-26 09:33:00' WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 30 | 01 | 01 | | 4 | 4 | 01 | 01 | | 5 | 5 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+Mengakses semua data historis yang disimpan sebelum versi yang ditentukan oleh konstanta.
SELECT * FROM mf_tt2 VERSION AS OF 2 WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 3 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+Mengakses semua data historis yang disimpan hingga waktu saat ini.
SELECT * FROM mf_tt2 TIMESTAMP AS OF current_timestamp() WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 30 | 01 | 01 | | 4 | 4 | 01 | 01 | | 5 | 5 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+Mengakses semua data historis yang disimpan hingga 10 detik yang lalu.
SELECT * FROM mf_tt2 TIMESTAMP AS OF current_timestamp() - 10 WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 30 | 01 | 01 | | 4 | 4 | 01 | 01 | | 5 | 5 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+Mengakses semua data historis yang disimpan hingga waktu ketika operasi kedua terakhir dikomit.
SELECT * FROM mf_tt2 TIMESTAMP AS OF get_latest_timestamp('mf_tt2', 2) WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+------------+------------+ | pk | val | dd | hh | +------------+------------+------------+------------+ | 1 | 1 | 01 | 01 | | 3 | 3 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+------------+------------+Mengakses semua data historis yang disimpan hingga versi operasi kedua paling baru.
SELECT * FROM mf_tt2 VERSION AS OF get_latest_version('mf_tt2', 2) WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 3 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+
Contoh kueri tambahan
Mengakses data tambahan historis dalam rentang waktu tertentu. Sebagai contoh, atur waktu mulai dan waktu akhir ke konstanta string tipe DATETIME berdasarkan waktu ketika operasi dikomit.
SELECT * FROM mf_tt2 TIMESTAMP BETWEEN '2023-06-26 09:31:40' AND '2023-06-26 09:32:00' WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 3 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+Mengakses data tambahan historis antara dua versi yang ditentukan.
SELECT * FROM mf_tt2 version BETWEEN 2 AND 3 WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 3 | 30 | 01 | 01 | | 4 | 4 | 01 | 01 | | 5 | 5 | 01 | 01 | +------------+------------+----+----+Mengakses data tambahan historis dalam 300 detik terakhir.
Contoh: Gunakan nilai default false untuk properti
acid.incremental.query.out.of.time.range.enableddari tabelmf_tt2.SELECT * FROM mf_tt2 TIMESTAMP BETWEEN current_timestamp() - 301 AND current_timestamp() WHERE dd = '01' AND hh='01';Kesalahan dikembalikan dalam hasil berikut.
FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.meta.exception.MetaException: com.aliyun.odps.meta.exception.MetaException: com.aliyun.odps.metadata.common.MetastoreServerException: Incremental query can't exceed current version. Current version timestamp: 2023-06-26 09:32:32, input timestamp is: 2023-06-26 10:47:55Contoh: Ubah nilai properti
acid.incremental.query.out.of.time.range.enableddari tabel menjadi true.ALTER TABLE mf_tt2 SET tblproperties("acid.incremental.query.out.of.time.range.enabled"="true");Contoh: Jalankan kueri lagi.
SELECT * FROM mf_tt2 TIMESTAMP BETWEEN current_timestamp() - 301 AND current_timestamp() WHERE dd = '01' AND hh='01';Hasil berikut ditampilkan:
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ +------------+------------+----+----+
Mengakses semua data historis dalam rentang waktu commit ketiga terbaru dan waktu commit pertama terbaru.
SELECT * FROM mf_tt2 TIMESTAMP BETWEEN get_latest_timestamp('mf_tt2', 3) AND get_latest_timestamp('mf_tt2') WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 30 | 01 | 01 | | 4 | 4 | 01 | 01 | | 5 | 5 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+Mengakses semua data historis dalam rentang versi operasi ketiga terbaru dan operasi pertama terbaru.
SELECT * FROM mf_tt2 VERSION BETWEEN get_latest_version('mf_tt2', 3) AND get_latest_version('mf_tt2') WHERE dd = '01' AND hh = '01';Hasil berikut dikembalikan.
+------------+------------+----+----+ | pk | val | dd | hh | +------------+------------+----+----+ | 1 | 1 | 01 | 01 | | 3 | 30 | 01 | 01 | | 4 | 4 | 01 | 01 | | 5 | 5 | 01 | 01 | | 2 | 2 | 01 | 01 | +------------+------------+----+----+