Cette rubrique décrit les instructions de traitement d'événements complexes (CEP) prises en charge par Realtime Compute for Apache Flink.
Contexte
Par rapport au langage SQL CEP d'Apache Flink, les instructions CEP de Realtime Compute for Apache Flink offrent des fonctionnalités améliorées, telles que la sortie des événements correspondants qui n'arrivent pas dans un intervalle de temps spécifique, la contiguïté relaxée via l'utilisation de followedBy(), et la configuration du modèle de contiguïté entre les événements. Pour plus d'informations sur les fonctionnalités de base du langage SQL CEP d'Apache Flink, consultez Reconnaissance de modèles.
Limites
Seule la version vvr-6.0.2-flink-1.15 ou ultérieure du moteur Realtime Compute for Apache Flink prend en charge la syntaxe SQL CEP étendue.
Seule la version vvr-6.0.5-flink-1.15 ou ultérieure du moteur Realtime Compute for Apache Flink prend en charge les modèles de groupe et la syntaxe AFTER MATCH NO SKIP.
Sortie des événements correspondants qui n'arrivent pas dans un intervalle de temps spécifique
L'exemple suivant illustre une séquence d'événements d'entrée.
+----+------+------------------+
| id | type | rowtime |
+----+------+------------------+
| 1 | A | 2022-09-19 12:00 |
| 2 | B | 2022-09-19 12:01 |
| 3 | A | 2022-09-19 12:02 |
| 4 | B | 2022-09-19 12:05 |
+----+------+------------------+
Pour spécifier que l'intervalle de temps entre les événements du modèle A B doit être inférieur à 2 minutes, ajoutez WITHIN INTERVAL '2' MINUTES après l'instruction PATTERN. Exemple de code :
SELECT *
FROM MyTable MATCH_RECOGNIZE (
ORDER BY rowtime
MEASURES
A.id AS aid,
B.id AS bid,
A.rowtime AS atime,
B.rowtime AS btime
PATTERN (A B) WITHIN INTERVAL '2' MINUTES
DEFINE
A AS type = 'A',
B AS type = 'B'
) AS T
Sans la clause WITHIN, deux séquences correspondantes id=1, id=2 et id=3, id=4 sont obtenues. Après l'ajout de la clause WITHIN, seule la première séquence correspondante est retenue. En effet, l'intervalle de temps entre l'événement A et l'événement B de la deuxième séquence est de 3 minutes, ce qui dépasse la limite de 2 minutes définie dans la clause WITHIN. Le résultat suivant est renvoyé :
+-----+-----+------------------+------------------+
| aid | bid | atime | btime |
+-----+-----+------------------+------------------+
| 1 | 2 | 2022-09-19 12:00 | 2022-09-19 12:01 |
+-----+-----+------------------+------------------+
Une fois la clause WITHIN ajoutée, les séquences d'événements correspondants dont les événements n'arrivent pas dans l'intervalle de temps spécifié sont considérées comme non concordantes et sont ignorées. Pour récupérer les séquences d'événements correspondants dont les événements n'arrivent pas dans l'intervalle de temps spécifié, utilisez l'instruction ONE ROW PER MATCH SHOW TIMEOUT MATCHES. Exemple de code :
SELECT *
FROM MyTable MATCH_RECOGNIZE (
ORDER BY rowtime
MEASURES
A.id AS aid,
B.id AS bid,
A.rowtime AS atime,
B.rowtime AS btime
ONE ROW PER MATCH SHOW TIMEOUT MATCHES
PATTERN (A B) WITHIN INTERVAL '2' MINUTES
DEFINE
A AS type = 'A',
B AS type = 'B'
) AS T
Le résultat suivant est renvoyé. Il inclut la séquence d'événements correspondants dont les événements n'arrivent pas dans l'intervalle de temps spécifié.
+-----+--------+------------------+------------------+
| aid | bid | atime | btime |
+-----+--------+------------------+------------------+
| 1 | 2 | 2022-09-19 12:00 | 2022-09-19 12:01 |
| 3 | <NULL> | 2022-09-19 12:00 | <NULL> |
+-----+--------+------------------+------------------+
L'heure d'arrivée de l'événement B dont l'id est 4 dépasse l'intervalle de temps spécifié dans la clause WITHIN. Cet événement n'est donc pas inclus dans les séquences correspondantes. Par conséquent, les champs bid et btime de cet événement sont NULL.
Modèles de contiguïté entre les événements
L'API Java CEP d'Apache Flink prend en charge les modèles de contiguïté suivants entre les événements : contiguïté stricte via next(), contiguïté relaxée via followedBy(), contiguïté relaxée non déterministe via followedByAny(), non-contiguïté stricte via notNext() et non-contiguïté relaxée via notFollowedBy().
Par défaut, le langage SQL CEP d'Apache Flink utilise la contiguïté stricte. Dans ce modèle, tous les événements correspondants doivent apparaître strictement les uns après les autres, sans événement non correspondant entre eux. Dans l'exemple précédent, le modèle (A B) impose que l'événement A et l'événement B se succèdent strictement. Realtime Compute for Apache Flink étend cette capacité pour prendre en charge une expression équivalente à celle de l'API Java.
Le tableau ci-dessous décrit les séquences correspondantes pour différents modèles, lorsque la séquence d'événements d'entrée est a1, b1, a2, a3, b2, b3.
Lors du processus de mise en correspondance, la clause AFTER MATCH SKIP utilise la stratégie SKIP TO NEXT ROW. Pour plus d'informations sur les stratégies de la clause AFTER MATCH SKIP, consultez Stratégie après mise en correspondance.
|
API Java |
SQL |
Stratégie |
Séquence correspondante |
|
|
|
Contiguïté stricte : attend que tous les événements correspondants apparaissent strictement les uns après les autres, sans événement non correspondant entre eux. |
|
|
|
C est un caractère non défini dans la clause DEFINE et sert à indiquer toute correspondance. |
Contiguïté relaxée : ignore les événements non correspondants qui apparaissent entre les événements correspondants. |
|
|
|
C est un caractère non défini dans la clause DEFINE et sert à indiquer toute correspondance. |
Contiguïté relaxée non déterministe : assouplit davantage la contiguïté et permet des correspondances supplémentaires qui ignorent certains événements correspondants spécifiques. |
Remarque
Les séquences correspondantes de cet exemple sont obtenues à l'aide de la stratégie SKIP TO NEXT ROW, qui est la stratégie AFTER MATCH par défaut du langage SQL CEP. La stratégie AFTER MATCH par défaut de l'API Java CEP d'Apache Flink est NO SKIP. Pour plus d'informations sur l'utilisation de la stratégie AFTER MATCH NO SKIP, consultez la section Stratégie AFTER MATCH NO SKIP de cette rubrique. |
|
|
|
Non-contiguïté stricte : exige qu'aucun événement correspondant n'apparaisse après un événement correspondant. |
|
|
|
C est un caractère non défini dans la clause DEFINE et sert à indiquer toute correspondance. Remarque
Si vous souhaitez utiliser notFollowedBy() à la fin d'un modèle, vous devez ajouter la clause WITHIN au modèle. |
Non-contiguïté relaxée : exige qu'aucun événement correspondant n'apparaisse entre deux événements correspondants. Lorsque vous utilisez cette syntaxe conjointement avec la clause WITHIN à la fin du modèle, aucun événement correspondant d'un type spécifique n'apparaît dans une période donnée. |
Aucune correspondance |
Contiguïté et mise en correspondance gloutonne dans les modèles en boucle
Le langage SQL CEP ne prend pas en charge la contiguïté relaxée non déterministe dans les modèles en boucle.
L'API Java CEP d'Apache Flink vous permet de spécifier les stratégies de contiguïté et de mise en correspondance gloutonne au sein des modèles en boucle. Par défaut, le langage SQL CEP d'Apache Flink utilise la contiguïté stricte et la mise en correspondance gloutonne. Par exemple, dans le modèle A+, aucun autre événement n'est autorisé entre plusieurs événements A, et le nombre d'événements A mis en correspondance est maximisé. Vous pouvez ajouter un ou plusieurs points d'interrogation (?) après le quantificateur de boucle, tel que *, + ou {3, }, afin de spécifier les stratégies de contiguïté et de mise en correspondance gloutonne.
Le tableau ci-dessous décrit les séquences correspondantes pour différents modèles de mise en correspondance, lorsque la séquence d'événements d'entrée est a1, b1, a2, a3, c1 et que la condition est A AS type = 'a', C AS type = 'a' or type = 'c'.
Lors du processus de mise en correspondance, la clause AFTER MATCH SKIP utilise la stratégie SKIP TO NEXT ROW. Pour plus d'informations sur les stratégies de la clause AFTER MATCH SKIP, consultez Stratégie après mise en correspondance.
|
Identifiants |
Continuité |
Stratégie de mise en correspondance gloutonne |
Exemple de modèle |
Sémantique équivalente |
Séquence correspondante |
|
Aucun |
Contiguïté stricte |
Gloutonne |
|
|
|
|
? |
Contiguïté stricte |
Non gloutonne |
|
|
|
|
?? |
Contiguïté relaxée |
Gloutonne |
|
|
|
|
??? |
Contiguïté relaxée |
Non gloutonne |
|
|
|
until(condition) dans les modèles en boucle
L'API Java CEP d'Apache Flink vous permet d'utiliser la fonction until(condition) pour spécifier une condition d'arrêt pour un modèle en boucle. Si l'événement actuel d'un modèle en boucle satisfait la condition spécifiée par la fonction until(condition), la mise en correspondance du modèle en boucle actuel est immédiatement interrompue et la mise en correspondance du modèle suivant commence à partir de l'événement actuel. Dans les déploiements SQL de Realtime Compute for Apache Flink, vous pouvez ajouter la syntaxe { CONDITION } à un quantificateur de boucle, tel que +, * et {3, }, pour exprimer la sémantique until.
Le tableau ci-dessous décrit les séquences correspondantes pour différents modèles, lorsque la séquence d'événements d'entrée est a1, d1, a2, b1, a3, c1 et que la condition est DEFINE A AS A.type = 'a' OR A.type = 'b', B AS B.type = 'b', C AS C.type = 'c'.
Lors du processus de mise en correspondance, la clause AFTER MATCH SKIP utilise la stratégie SKIP TO NEXT ROW. Pour plus d'informations sur les stratégies de la clause AFTER MATCH SKIP, consultez Stratégie après mise en correspondance.
|
Modèle |
Sémantique équivalente |
Séquence correspondante |
Description |
|
|
|
|
Les événements commençant par a ou b peuvent correspondre au modèle en boucle A, et une contiguïté stricte est appliquée entre les événements du modèle en boucle A et les modèles A et C. L'événement d1 existe entre a1 et a2 dans la séquence d'événements d'entrée. Par conséquent, la mise en correspondance ne peut pas commencer par a1. |
|
|
|
|
La condition until(B) est ajoutée au modèle en boucle A et une contiguïté stricte reste appliquée entre les modèles A et C. Le modèle en boucle qui commence à a2 se termine à b1. Par conséquent, a2 et c1 ne satisfont pas aux exigences de continuité stricte. |
|
|
|
|
Une contiguïté relaxée est appliquée entre les modèles A et C. Le modèle en boucle qui commence à a2 se termine à b1 et ignore b1 et a3 pour mettre en correspondance c1. |
|
|
|
|
Une contiguïté relaxée est appliquée aux événements du modèle en boucle A. Le modèle ignore d1 et se termine à b1 pour mettre en correspondance a1 et a2. |
Modèle de groupe
L'API Java CEP d'Apache Flink prend en charge les modèles de groupe. Dans un modèle de groupe, plusieurs modèles sont combinés et utilisés dans la fonction next(), followedBy() ou followedByAny(). Un modèle de groupe peut être répété dans son ensemble. Dans les déploiements SQL de Realtime Compute for Apache Flink, vous pouvez utiliser la syntaxe (...) de la norme SQL pour définir un modèle de groupe. Des quantificateurs de boucle, tels que +, * et {3, }, peuvent être utilisés.
Par exemple, dans le modèle PATTERN (A (B C*)+? D) , (B C*) est un modèle de groupe déclaré pour apparaître plusieurs fois. Le point d'interrogation (?) indique l'utilisation de la stratégie de mise en correspondance non gloutonne. Exemple de code Java :
Pattern.<String>begin("A").where(...)
.next(
Pattern.<String>begin("B").where(...)
.next("C").where(...).oneOrMore().optional().greedy().consecutive())
.oneOrMore().consecutive()
.next("D").where(...)
La clause MEASURES définit le contenu inclus dans la sortie d'un modèle de groupe correspondant. Par exemple, si les séquences correspondantes sont b1, b2 c1 et b3 c2 c3 à chaque fois que le modèle de groupe spécifié est mis en correspondance, vous pouvez utiliser la clause MEASURES pour afficher uniquement une partie des résultats de mise en correspondance. Si vous souhaitez que seul l'événement b soit affiché en sortie, utilisez FIRST(B.id) pour obtenir l'événement b de la première séquence correspondante et FIRST(B.id,1) pour obtenir l'événement b de la deuxième séquence correspondante. Appliquez la même méthode pour obtenir l'événement b de la troisième séquence correspondante. Ainsi, la sortie du modèle de groupe sera b1, b2, b3. Exemple de code :
SELECT *
FROM MyTable MATCH_RECOGNIZE (
ORDER BY rowtime
MEASURES
FIRST(B.id) AS b1_id,
FIRST(B.id,1) AS b2_id,
FIRST(B.id,2) AS b3_id
PATTERN (A (B C*)+? D)
DEFINE
A AS type = 'A',
B AS type = 'B',
C AS type = 'C',
D AS type = 'D'
) AS T
Notez que la continuité déclarée entre un modèle de groupe et son modèle précédent s'applique au premier modèle du groupe plutôt qu'à l'ensemble du modèle de groupe. Par exemple, dans le modèle PATTERN (A {- X*? -} (B C)) , followedBy est utilisé entre le modèle A et le modèle de groupe (B C). Cela déclare une continuité followedBy entre le modèle A et le modèle B. Dans ce cas, plusieurs événements ne correspondant pas au modèle B peuvent exister entre le modèle A et le modèle de groupe (B C), mais aucun événement ne correspondant pas au modèle de groupe (B C) ne peut exister. Si aucune sortie n'est générée pour le modèle PATTERN (A {- X*? -} (B C)) basé sur la séquence d'événements d'entrée a1 b1 d1 b2 c1, c'est parce que le processus de mise en correspondance entre immédiatement dans le modèle de groupe (B C) après l'apparition de b1, et d1 ne correspond pas au modèle C. Par conséquent, la mise en correspondance de la séquence échoue.
Les modèles de groupe en boucle, tels que le modèle
PATTERN ((A B)+), ne prennent pas en charge la mise en correspondance gloutonne.Les modèles de groupe, tels que les modèles
PATTERN (A+{(B C)})etPATTERN (A [^(B C)]), ne peuvent pas être utilisés dans la syntaxe until ou notNext.Le premier modèle d'un modèle de groupe, tel que le modèle
PATTERN (A (B? C)), ne peut pas être déclaré comme facultatif.
Stratégie AFTER MATCH NO SKIP
Dans l'API Java CEP d'Apache Flink, la stratégie AFTER MATCH par défaut est NO_SKIP. Dans le langage SQL CEP d'Apache Flink, la stratégie AFTER MATCH par défaut est SKIP_TO_NEXT_ROW. Realtime Compute for Apache Flink étend la clause AFTER MATCH de la norme SQL. Vous pouvez utiliser la clause AFTER MATCH NO SKIP pour déclarer la stratégie NO_SKIP. Lorsque la stratégie NO_SKIP est utilisée, les processus de mise en correspondance existants ne sont ni interrompus ni ignorés lorsque la mise en correspondance d'une séquence est terminée.
La stratégie NO_SKIP est généralement utilisée conjointement avec followedByAny pour ignorer certains événements correspondants afin d'assurer une continuité relaxée. Par exemple, si la séquence d'événements d'entrée est a1 b1 b2 b3 c1, la sortie pour le modèle PATTERN (A {- X* -} B {- Y*? -} C) est a1 b1 c1 lorsque la stratégie par défaut AFTER MATCH SKIP TO NEXT ROW est utilisée. Le modèle PATTERN (A {- X -} B {- Y? -} C) équivaut à Pattern.begin("A").followedByAny("B").followedBy("C"). En effet, toutes les séquences commençant par a1 sont ignorées lorsque la mise en correspondance pour a1 b1 c1 est terminée. Toutefois, si vous utilisez AFTER MATCH NO SKIP, toutes les séquences correspondantes peuvent être obtenues. Dans ce cas, a1 b1 c1, a1 b2 c1 et a1 b3 c1 sont renvoyés.