2016-12-16 4 views
0

Je rencontre des problèmes avec Stream Analytics Windowing. L'entrée de mon Job Stream Analytics est un flux d'événements contenant des mesures de température provenant de capteurs/entités appartenant à un signal. Chaque signal a environ 600 entités. Un exemple d'événement ressemblerait à ceci. Stream Analytics lit les valeurs de seuil pour chaque entité à partir d'un blob de données de référence qui ressemble à quelque chose comme ceci.Azure Stream Analytics Windowing

[{ 
    "SignalId": "1", 
    "Entities": [{ 
     "Id": 1, 
     "Threshold": 60 
     }, { 
      "Id": 2, 
      "Threshold": 108 
     }, { 
      "Id": 3, 
      "Threshold": 106 
     }] 
}, { 
    "SignalId": "2", 
    "Entities": [{ 
     "Id": 1, 
     "Threshold": 65 
    }, { 
     "Id": 2, 
     "Threshold": 120 
    }, { 
     "Id": 3, 
     "Threshold": 107 
    }] 
}] 

J'ai écrit un flux de requête Google Analytics pour filtrer l'événement et insérer une « alarme » dans une base de données SQL Azure si les valeurs de température sont supérieures à leurs seuils respectifs.

SELECT 
    e.SignalId AS SignalId, 
    e.EntityId AS EntityId, 
    e.Temperature AS AttrValue, 
    entities.ArrayValue.Threshold AS Threshold, 
    SYSTEM.TIMESTAMP AS EventTimestamp 
INTO 
    output 
FROM 
    eventhub e 
JOIN 
    referenceblob b 
ON 
    e.SignalId = b.SignalId 
CROSS APPLY 
    GetElements(b.Entities) entities 
WHERE 
    e.EntityId = entities.ArrayValue.Id 
AND 
    e.Temperature > entities.ArrayValue.Threshold 

Ce dont j'ai besoin maintenant est de mettre une fenêtre coulissante (je suppose) sur ce point. Je veux seulement créer une "Alarme" si la valeur de température pour une entité franchit son seuil respectif pendant une période de 1 heure. La ligne insérée doit contenir des données relatives au dernier événement de la fenêtre.

Je suis nouveau à Stream Analytics et T-SQL et, pour être honnête, je ne comprenais pas exactement comment fonctionnent les fonctions de fenêtrage. Voici mes questions ...

  1. Si je reçois mauvais événements (où la température est supérieure au seuil) en continu pendant 30 minutes, puis obtenir un bon événement, est-il possible d'écrire une requête telle qu'une nouvelle fenêtre commence à partir du prochain mauvais événement?

  2. Est-il possible de sélectionner des données pour le dernier événement dans la fenêtre? J'ai essayé d'utiliser LAST() et LAG() mais cela m'a donné une erreur de compilation disant "Impossible d'utiliser GROUP BY sans une fonction Aggregate". Le problème est que je n'ai pas besoin d'une fonction Aggregate uniquement les valeurs des derniers événements.

J'ai été bloqué sur ce problème pendant des jours et toute aide serait grandement appréciée.

De plus, ceci est ma première question alors s'il vous plaît pardonnez mon noobishness

Répondre

0

Vous pouvez implémenter cela avec une fenêtre coulissante. La fenêtre coulissante produit une sortie sur chaque événement et se penche sur la durée fournie. Dans votre exemple, vous voulez une sortie uniquement lorsque la lecture était inférieure au seuil pendant 1 heure. Une requête comme ci-dessous devrait fonctionner.

SELECT Entity, max(Reading) MaxReading INTO [YourOutputAlias] FROM [YourInputAlias] group by Entity, SlidingWindow(hour,1) having MaxReading <100