2017-09-18 1 views
0

Gibt es eine Möglichkeit, das Postgres-Äquivalent von array_agg oder string_agg in Stream Analytics zu tun? Ich habe Daten, die alle paar Sekunden kommen, und möchte die Anzahl der Werte innerhalb eines Zeitrahmens erhalten.Azure stream analytics array_agg entspricht?

Daten:

{time:12:01:01,name:A,location:X,value:10} 
{time:12:01:01,name:B,location:X,value:9} 
{time:12:01:02,name:C,location:Y,value:5} 
{time:12:01:02,name:B,location:Y,value:4} 
{time:12:01:03,name:B,location:Z,value:2} 
{time:12:01:03,name:A,location:Z,value:3} 
{time:12:01:06,name:B,location:Z,value:4} 
{time:12:01:06,name:C,location:Z,value:7} 
{time:12:01:08,name:B,location:Y,value:1} 
{time:12:01:13,name:B,location:X,value:8} 

Mit einem Schiebefenster von 2 Sekunden, ich gruppieren möchten die Daten folgendes sehen:

12:01:01, 2 events, 9.5 avg, 2 distinct names, 1 distinct location, nameA:1, nameB:1, locationX:1 
12:01:02, 4 events, 7 avg, 3 distinct names, 2 distinct location, nameA:1, nameB:2,nameC:1,locationX:1,locationY:1 
12:01:03... 
12:01:06... 
... 

Ich kann die Anzahl der Ereignisse, Durchschnitt erhalten, und distinct zählt ohne Problem. Ich benutze ein Fenster sowie eine With-Anweisung, um am Zeitstempel teilzunehmen, um die aggregierten Zählungen für diesen Zeitstempel zu erhalten. Ich habe Probleme herauszufinden, wie ich die Gesamtanzahl nach Name und Ort ermitteln kann, hauptsächlich weil ich nicht weiß, wie man Zeichenketten in Azure aggregiert.

Es gibt keine festgelegte Liste von Namen und Orten, daher muss die Abfrage etwas dynamisch sein. Es ist in Ordnung, wenn die Anzahl in einem Objekt innerhalb einer einzelnen Abfrage liegt, ein Prozess kann später analysieren, um individuelle Zählungen zu erhalten.

Antwort

1

Soweit ich weiß, bietet azure Stream-Analyse nicht die Methode array_agg. Aber es bietet Collect Methode, die alle Datensatzwerte aus dem Fenster zurückgeben könnte.

Ich schlage vor, Sie könnten Collect Methode zuerst das Array, die nach der Zeit und Fenster gruppiert zurückgeben.

Dann könnten Sie Azure Stream Analytics JavaScript user-defined functions verwenden, um Ihre eigene Logik zu schreiben, um das Array in das Ergebnis zu konvertieren.

Weitere Details können Sie auf unter Beispiel verweisen:

Die Abfrage wie folgt aus:

SELECT 
    time, udf.yourunfname(COLLECT()) as Result 
INTO 
    [YourOutputAlias] 
FROM 
    [YourInputAlias] 
Group by time, TumblingWindow(minute, 10) 

Die UDF ist wie folgt:

Ich kehre nur die avg und die Ereignis Länge.

function main(InputJSON) { 
     var sum = 0; 
     for (i = 0; i < InputJSON.length; i++) { 
      sum += InputJSON[i].value; 

     } 
    var result = {events:InputJSON.length,avg:sum/InputJSON.length }; 

    return result; 
} 

Daten:

{"name": "A", "time":"12:01:01","value":10} 

{"name": "B", "time":"12:01:01","value":9} 

{"name": "C", "time":"12:01:02","value":10} 

Ergebnis:

enter image description here

Verwandte Themen