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 aidbidang .

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,
      ...
    

Lihat juga