如何使用Stream Analytics存储传入事件的UDF返回值?

时间:2019-01-23 02:16:47

标签: javascript c# user-defined-functions azure-stream-analytics stream-analytics

我需要将下面的C#代码转换为Azure Stream Analytics可以使用的代码。

我有一个类似于以下内容的C#应用​​程序:

var inputEvents = new List<Event>();
foreach (var file in files){
    (List<Event> events, DateTime maxDate) = ProcessEvents(file, inputEvents);
    inputEvents = events.Where(e => e.Duration == null).ToList();
}

ProcessEvents()将inputEvents传递给其他辅助方法的地方

我需要使用Stream Analytics来实现整个代码。 var文件部分是通过使用Collect()收集一堆事件来实现的。每一批都发送到充当 ProcessEvents()的UDF。但是,ProcessEvents()返回下一次迭代所需的其他事件。由于UDF是无状态的,因此下一批将无法使用前一批返回的事件。

如何在Stream Analytics中重写上面的C#代码?

我尝试了以下操作:

  • 使用UDA存储返回的事件。失败,因为由于某种原因它无法存储JSON数组并不断对其进行修改。
  • 使用参考数据输入来存储返回的事件。失败,因为它们只能在使用JOIN的流分析中使用,而不能在UDF内使用。

流分析T-SQL查询:

WITH eventsCollection AS (SELECT COLLECT() AS allEvents
FROM EventHubStreamMessage
GROUP BY SessionWindow(minute,2,4)),

step1 AS (
    SELECT UDF.SampleProcessEvents(allEvents) as Source
    FROM eventsCollection
)

SELECT *
INTO [StorageTable]
FROM step1 

Stream Analytics UDF代码(简短版本):

function main(allEvents){
    allEvents = JSON.stringify(allEvents);
    var inputEvents = new Array ();

    return processEvents(JSON.parse(allEvents), inputEvents)
}

function processEvents(allEvents, inputEvents){
    for (i=0l i<allEvents.length; i++){
        if (allEvents[i].Event =="ON"){
            powerOn(inputEvents);
        }
    }
}

function powerOn(inputEvents){
    return true;
}

0 个答案:

没有答案