簡體   English   中英

將分析流分組到事件中心 - 意外地連接事件

[英]Stream Analytics to Event Hub - Unexpectedly concatenating events

我有一個流分析工作正在消耗avro消息的事件中心(我們稱之為RawEvents),轉換/展平消息並將它們發送到一個單獨的事件中心(我們稱之為FormattedEvents)。

RawEvents中的每個EventData實例都包含一個頂級json對象,該對象具有一系列更詳細的事件。 這是一個人為的例子:

[{“Events”:[{“dataOne”:123.0,“dataTwo”:234.0,“subEventCode”:3,“dateTimeLocal”:1482170771,“dateTimeUTC”:1482192371},{“dataOne”:456.0,“dataTwo”: 789.0,“subEventCode”:20,“dateTimeLocal”:1482170771,“dateTimeUTC”:1482192371}],“messageType”:“myDeviceType-Events”,“deviceID”:“myDevice”,}]

Stream Analytics作業將結果展平並解壓縮subEventCode,這是一個位掩碼。 結果看起來像這樣:

{ “為messageType”: “myDeviceType-事件”, “設備ID”: “mydevice在”,事件ID:1, “dataone”:123, “datatwo”:234, “subeventcode”:6, “FLAG1”:0, “FLAG2” :1, “相當於Flag3”:1, “Flag4的”:0 “flag5”:0 “flag6”:0 “flag7”:0 “flag8”:0 “flag9”:0 “flag10”:0 “flag11”:0 “flag12”:0 “flag13”:0 “flag14”:0 “flag15”:0 “flag16”:0 “eventepochlocal”:“2016-12-06T17:33: 11.0000000Z“,”eventepochutc“:”2016-12-06T23:33:11.0000000Z“} {”messagetype“:”myDeviceType-Event“,”deviceid“:”myDevice“,eventid:2,”dataone“:456, “datatwo”:789, “subeventcode”:8, “FLAG1”:0, “FLAG2”:0 “Flag3相同的”:0 “Flag4的”:1, “flag5”:0 “flag6”:0,“flag7 “:0,” flag8 “:0”,flag9 “:0”,flag10 “:0”,flag11 “:0”,flag12 “:0”,flag13 “:0”,flag14 “:0”,flag15" : 0 “flag16”:0 “eventepochlocal”: “2016-12-06T17:33:11.0000000Z”, “eventepochutc”: “2016-12-06T23:33:11.0000000Z”}

當我從FormattedEvents事件中心提取消息時,我期待看到兩個EventData實例。 我得到的是一個EventData,在同一個消息中有兩個“flattened”事件。 這是針對blob存儲或Data Lake時的預期行為,但在定位事件中心時卻出人意料。 我的期望是與服務總線類似的行為。

這是預期的行為嗎? 是否有強制行為的配置選項?

是的,這是目前的預期行為。 目的是提高嘗試在EventHub消息(EventData)中發送盡可能多的事件的吞吐量。

不幸的是,從今天開始,沒有配置選項可以覆蓋此行為。 可能值得嘗試的一種可能方式是將輸出分區鍵的概念用於超級唯一的(即將此列添加到您的查詢中 - GetMetadataPropertyValue(ehInput,“EventId”)作為outputpk)。 現在在輸出EventHub的ASA設置中將“outputpk”指定為PartitionKey。

如果有幫助,請告訴我。

干杯Chetan

我遇到了同樣的問題。 感謝您手動格式化輸入消息的答案。 我和我的同事用幾行代碼解決了這個問題,刪除了換行和回車。 然后我將“} {”替換為“},{”並通過向兩端添加“[”和“]”使其成為一個數組。

string modifiedMessage = myEventHubMessage.Replace("\n","").Replace("\r","");    
modifiedMessage = "[" + modifiedMessage.Replace("}{","},{") + "]";

然后根據數據結構將輸入作為對象列表:

List<TelemetryDataPoint> newDataPoints = new List<TelemetryDataPoint>();
try
{
    newDataPoints = Newtonsoft.Json.JsonConvert.DeserializeObject<List<TelemetryDataPoint>>(modifiedMessage);

.... ....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM