1

Ich versuche einige protokollierte Ereignisse aus Application Insights in unsere SQL-Datenbank zu ziehen. Ich habe keine Kontrolle über das Format der Eingänge, die JSON-Dateien sind, die aus mehreren JSON-Arrays innerhalb der Datei bestehen. In jedem Datensatz befinden sich 5 Informationen in einem json-Array unter [context]. [Custom]. [Dimensions] in der Datei und mit einem OUTER APPLY werden diese Werte abgeflacht. Das Problem ist, dass die Ergebnisse nicht als eine Zeile pro Datensatz ausgegeben werden, sondern als eine Zeile mit 5 (was tatsächlich der Fall ist) und die Werte der 5 Daten in 4 Fällen NULL und der tatsächliche Wert in sind das andere. Ich brauche nur 2 der 5 Werte - PageType und UserId - und in meiner GROUP BY gibt es 3 Datensätze, einen mit jedem Wert und einen mit beiden null.Zusammenführen mehrerer Datensätze mit Zeichenfolgen und Nullen in einer Stream Analytics-Gruppe. Durch

In normalen SQL würden Sie einfach einen MAX-Ausdruck verwenden, um die tatsächlichen Werte für jeden zu erhalten, aber in Stream Analytics können Sie MAX nicht für Strings verwenden. Sie können auch nicht COALESCE und eine Reihe anderer Methoden verwenden, mit denen ich versucht habe, dies zu lösen. Irgendwelche Ideen, wie die Ergebnisse aus geändert werden:

EventDateTime Event  PageType UserId AppVersion CountA 
2017-05-24  Nav Show NULL  NULL 2.0.1293  1 
2017-05-24  Nav Show NULL  SIRTSW 2.0.1293  1 
2017-05-24  Nav Show Trade NULL 2.0.1293  1 

zu

2017-05-24  Nav Show Trade SIRTSW 2.0.1293  1 ? 

Der Code, liefert drei Reihen für jeden ist wie folgt (beachten Sie, dass e.event ist ein Array von einem Element, so dass es nicht das gleiche Problem verursachen):

SELECT flatEvent.ArrayValue.name as Event, 
e.context.data.eventTime as EventDateTime, 
e.context.application.version as AppVersion 
,flatCustom.ArrayValue.UserId as UserId 
,flatCustom.ArrayValue.PageType as PageType, 
SUM(flatEvent.ArrayValue.count) as CountA 
INTO 
     [insights] 
    FROM [ios] e 
    CROSS APPLY GetArrayElements(e.[event]) as flatEvent 
    OUTER APPLY GetArrayElements(e.[context].[custom].[dimensions]) as flatCustom 
    GROUP BY SlidingWindow(minute, 1), 
    flatEvent.ArrayValue.name, 
    e.context.data.eventTime, 
    e.context.application.version, 
    flatCustom.ArrayValue.UserId, 
    flatCustom.ArrayValue.PageType 

Vielen Dank im Voraus, Rob

+0

Können Sie Unterabfragen in Stream Analytics verwenden? –

Antwort

1

Gemäß Ihrem Szenario ging ich davon aus, dass Sie für Azure Stream Analytics JavaScript user-defined functions verwenden können, um die mehreren Dimensionen zu einem einzigen Datensatz zusammenzuführen. Hier ist mein Test für dieses Problem, auf den Sie sich beziehen könnten.

JSON-Datei

{ 
    "context":{ 
    "data":{"eventTime":"2017-05-24"}, 
    "application":{"version":"2.0.1293"}, 
    "custom":{ 
     "dimensions":[ 
      {"PageType":null,"UserId":"SIRTSW"}, 
      {"PageType":"Trade","UserId":null}, 
      {"PageType":null,"UserId":null} 
     ] 
    } 
    }, 
    "event":[ 
    {"name":"Nav Show","count":1} 
    ] 
} 

javascript UDF, UDF.coalesce

function main(items) { 
    var result=[]; 
    var UserIdStr="",PageTypeStr=""; 
    for(var i=0;i<items.length;i++){ 
     if(items[i].UserId!=null && items[i].UserId!=undefined) 
     UserIdStr+=items[i].UserId; 
     if(items[i].PageType!=null && items[i].PageType!=undefined) 
     PageTypeStr+=items[i].PageType; 
    } 
    result.push({UserId:UserIdStr,PageType:PageTypeStr}); 
    return result; 
} 

Abfrage

TESTERGEBNIS enter image description here

+0

Brilliante Antwort, danke. Die Lektion hier ist, was andere Tools möglicherweise das Problem lösen können, anstatt SQL. Seltsamerweise habe ich einen Syntaxfehler bei UDF.coalesce (ja ich bin mir sicher, dass es keinen Rechtschreibfehler gab) beim Aufruf in der Abfrage bekommen. Ich habe eine zweite identische Version namens UDF.combine erstellt, die nicht den Syntaxfehler hatte, also ein bisschen verwirrend. – user3775501

Verwandte Themen