全部产品
Search
文档中心

MaxCompute:Kueri perjalanan waktu dan kueri tambahan

更新时间:Jun 19, 2025

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>]
null

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(), dan getDate().

        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 tablename harus diformat sebagai ProjectName.TableName.

        • Untuk model tiga lapis, nilai parameter tablename harus diformat sebagai ProjectName.SchemaName.TableName.

        • Parameter number bersifat 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 expr lebih 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 parameter acid.data.retain.hours yang 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 expr adalah N jam yang lalu, kesalahan mungkin terjadi. N ditentukan oleh parameter acid.data.retain.hours yang dikonfigurasikan selama pembuatan tabel. Hal ini disebabkan oleh latensi tingkat detik dalam interaksi sistem internal. Oleh karena itu, hindari menggunakan sintaksis seperti TIMESTAMP 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 tablename harus diformat sebagai ProjectName.TableName.

        • Untuk model tiga lapis, nilai parameter tablename harus diformat sebagai ProjectName.SchemaName.TableName.

        • Parameter number bersifat opsional dengan nilai default 1. Parameter ini menentukan nomor urutan operasi data dalam urutan kronologis terbalik. Versi VERSION yang dikembalikan bervariasi sesuai dengan nilai parameter number.

  • Batasan

    • Setiap operasi DML menghasilkan nomor versi yang meningkat secara ketat. Gunakan SHOW HISTORY FOR TABLE/PARTITION untuk 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. Parameter CreateTableVersion menentukan 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.hours yang 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_expr dan end_expr: Penggunaan dan batasan kedua parameter ini konsisten dengan parameter EXPR dalam sintaksis TIMESTAMP 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_expr lebih dari N jam yang lalu atau lebih awal dari waktu pembuatan tabel, kesalahan akan dikembalikan. N ditentukan oleh parameter acid.data.retain.hours.

    • Jika waktu yang ditentukan oleh parameter end_expr lebih baru daripada waktu ketika operasi DML terakhir dikomit, hasil kueri bergantung pada nilai parameter acid.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 TABLE untuk 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_expr dan end_expr: Penggunaan dan batasan kedua parameter ini konsisten dengan parameter expr dalam sintaksis VERSION 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 parameter acid.data.retain.hours yang dikonfigurasikan untuk kueri perjalanan waktu.

    • Jika versi yang ditentukan oleh parameter end_expr lebih baru daripada versi operasi DML terakhir, hasil kueri akan bervariasi berdasarkan nilai parameter acid.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.enabled dari tabel mf_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:55
      • Contoh: Ubah nilai properti acid.incremental.query.out.of.time.range.enabled dari 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 |
      +------------+------------+----+----+