MATCH_RECOGNIZE (Analisis Aliran)
Klausa MATCH_RECOGNIZE digunakan untuk mencari serangkaian peristiwa melalui aliran data. Klausa ini memungkinkan Anda menentukan pola peristiwa menggunakan ekspresi reguler dan metode agregat untuk memverifikasi dan mengekstrak nilai dari kecocokan.
Contoh berikut menunjukkan struktur dasar klausa MATCH_RECOGNIZE:
SELECT *
INTO output FROM input TIMESTAMP BY time
MATCH_RECOGNIZE (
LIMIT DURATION (minute, 1)
PARTITION BY tollBoothId
MEASURES
Last(Toyota.LicensePlate) AS toyotaLicensePlate,
Last(Lexus.LicensePlate) AS lexusLicensePlate
AFTER MATCH SKIP TO NEXT ROW
PATTERN (Toyota+ Ford* Lexus+)
DEFINE
Toyota AS Toyota.make = 'Toyota',
Ford AS Ford.make = 'Ford',
Lexus AS Lexus.make = 'Lexus'
) AS T
MATCH_RECOGNIZE memiliki output yang cocok dari ONE ROW PER MATCH sebagai default, yang merupakan satu-satunya pencocokan yang tersedia. Ini berarti kecocokan menghasilkan hasil baris tunggal per kecocokan dan tidak mengembalikan baris yang cocok.
Sintaks
SELECT_star_query_definition
MATCH_RECOGNIZE (
LIMIT DURATION (time_unit, time)
PARTITION BY column_alias
MEASURES
expression AS column_alias [,...n]
AFTER MATCH SKIP TO NEXT ROW
PATTERN ( <pattern_group> )
DEFINE
pattern_name AS boolean_expression [,…n]
) AS column_alias
<pattern_group> ::=
{
<pattern_name_modifier> [ | <pattern_group> ]*
}
<pattern_name_modifier> ::=
{
<pattern_atom> [ <pattern_atom> ]*
}
<pattern_atom> ::=
{
[ pattern_name | ( <pattern_group> ) ] [ <pattern_modifier> ]?
}
<pattern_name> :: =
{
name | .
}
<pattern_modifier> ::=
{
* | + | ?
}
BATAS DURASI
Durasi batas digunakan untuk menentukan jendela waktu untuk pola yang akan dicari. Peristiwa diurutkan berdasarkan waktu dan TIMESTAMP BY dapat digunakan pada klausa SELECT untuk menentukan bidang waktu.
PARTISI BERDASARKAN
PARTITION BY memungkinkan pencocokan dikuntangani dan dipartisi melalui nama kolom. Kecocokan akan terjadi di setiap kunci unik yang ditentukan oleh pernyataan partisi. Ini memungkinkan satu kueri dicocokkan di semua kunci dan menghasilkan kecocokan terpisah, satu ke setiap kunci.
SETELAH KECOCOKAN LEWATI KE BARIS BERIKUTNYA
Klausa skip ini menentukan bahwa setelah pola dicocokkan dimulai pada peristiwa S, pola percobaan berikutnya untuk mencocokkan akan dimulai pada peristiwa S+1. Kecocokan dapat tumpang tindih dalam hal ini karena pola dapat berisi awal pola lain di dalamnya. Ini adalah satu-satunya klausa lewati yang tersedia.
LANGKAH
MEASURES digunakan untuk menentukan nilai yang diproyeksikan dari kecocokan menggunakan metode agregat. Misalnya, LAST(A.id) AS aid
akan menghasilkan nilai terakhir id
yang ditemukan di semua peristiwa yang cocok dengan pola yang dinamai A
ke dalam nama aid
bidang .
Fungsi pengklasifikasi
Fungsi pengklasifikasi dapat digunakan dalam MEASURES untuk menghasilkan nama pola yang cocok dengan peristiwa input. Fungsi mengembalikan daftar string, masing-masing dengan nama pola yang cocok dengan peristiwa.
POLA
Pola menentukan ekspresi reguler peristiwa yang akan dicari melalui aliran data. Variabel pola ditentukan pengguna dan dipisahkan oleh spasi. Pengubah seperti + dan * dapat digunakan untuk memodifikasi frekuensi variabel saat mencocokkan peristiwa.
Contoh
PATTERN (A+ (B | C))
Pola pada contoh ini mendefinisikan variabel A setidaknya sekali, diikuti dengan perangkaian B atau C.
Pengukur Pola
Kuantifer pola digunakan untuk mengubah bagaimana pola dipetakan dalam aliran data, menentukan berapa kali pola perlu dicocokkan agar valid. Kuantifer berikut tersedia:
- '*' - Nol atau lebih kali
- '+' - Satu atau beberapa kali
- '?' – Nol atau satu kali
- '|' - Satu pola atau pola lainnya
Contoh:
PATTERN (A? B+)
Contoh ini mendefinisikan A 0 atau 1 kali diikuti oleh B setidaknya sekali.
DEFINE
DEFINE menentukan aturan yang digunakan untuk mencocokkan variabel pola dengan peristiwa. Aturannya adalah ekspresi Boolean atas nilai agregat dari aliran data.
DEFINE
A AS Last(A.bigint) > 5,
B AS Last(A.bigint) < B.bigint
Contoh ini mendefinisikan aturan A dan B di mana nilai TERAKHIR A lebih besar dari 5, dan B di mana nilai TERAKHIR A lebih kecil dari nilai B saat ini. Saat tidak menggunakan fungsi agregat pada ekspresi DEFINE, peristiwa saat ini sedang dievaluasi mengikat variabel pola, misalnya, pada B.bigint , nilai B berasal dari peristiwa saat ini yang sedang dievaluasi.
Pola yang ditentukan hanya dapat diakses secara berurutan, jika pola A ditentukan sebelum pola B, A tidak dapat mereferensikan B.
Diizinkan
...
DEFINE
A AS Last(A.value),
B AS Max(A.value) + Max(B.value),
...
Tidak diizinkan
...
DEFINE
A AS Last(A.value) + Last(B.Value),
B AS Max(A.value) + Max(B.value),
...
Metode Agregat
Metode agregat berikut dapat digunakan dalam MEASURES dan DEFINE:
- Min – Angka minimum yang diagregasi sejauh ini.
- Maks – Angka maksimum yang diagregasi sejauh ini.
- Pertama – Nilai pertama diagregasi.
- Terakhir – Nilai terakhir yang diagregasi sejauh ini.
Contoh:
Mengisi ulang tangki bertekanan tinggi adalah proses berbahaya dan perlu dipantau dengan cermat karena meningkatkan tekanan pada tangki juga meningkatkan suhunya, tekanan perlu meningkat terus untuk memberikan waktu bagi tangki untuk mendingin saat mengisi ulang.
Dalam contoh ini, pengembang ingin memantau pengisian ulang tangki bertekanan tinggi saat mulai meningkatkan tekanan. Tangki mulai mengisi ulang dan tidak dapat meningkatkan tekanan dengan gandanya dalam waktu kurang dari 3 menit, jika tidak, tangki terlalu tinggi dan dapat menyebabkan kegagalan bencana.
Kueri berikut dapat digunakan untuk memantau kemajuan:
SELECT *
INTO output FROM input TIMESTAMP BY time
MATCH_RECOGNIZE (
LIMIT DURATION (minute, 3)
MEASURES
MAX(Dangerous.pressure) as pressure,
Classifier() as patterns
AFTER MATCH SKIP TO NEXT ROW
PATTERN (Normal+ Dangerous+)
DEFINE
Normal AS Normal.isFilling = 1,
Dangerous AS Max(Dangerous.pressure) > 2* Max(Normal.pressure)
) AS T
Kueri ini cocok dengan Normal dengan peristiwa apa pun yang mengisi tangki dan jika tekanan lebih dari dua kali lipat dari pengisian Normal dalam waktu 3 menit, daripada peristiwa ditembakkan dengan pembacaan tekanan maksimum untuk pola Berbahaya .
Batasan
Hanya nilai bidang yang dapat digunakan untuk agregat. Tidak ada fungsi yang dapat dipanggil di dalam panggilan agregat.
Diizinkan
... DEFINE A AS Max(A.value) > 5, ...
Tidak diizinkan
... DEFINE A AS Max(udf.myUdf(A.value)) > 5, ...
Hanya satu bidang yang dapat diberikan ke fungsi agregat sebagai parameter input.
Diizinkan
... DEFINE A AS Max(A.value) > 5, ...
Tidak diizinkan
... DEFINE A AS Max(A.value1 + A.value2) > 5, ...