将分析流分组到事件中心 - 意外地连接事件

时间:2017-02-13 20:58:18

标签: azure azure-eventhub azure-stream-analytics

我有一个流分析工作正在使用avro消息的事件中心(我们称之为RawEvents),转换/展平消息并将它们发送到一个单独的事件中心(我们称之为FormattedEvents)。 / p>

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时的预期行为,但在定位事件中心时却出人意料。我的期望是与服务总线类似的行为。

这是预期的行为吗?是否有强制行为的配置选项?

2 个答案:

答案 0 :(得分:0)

是的,这是目前的预期行为。目的是提高尝试在EventHub消息(EventData)中发送尽可能多的事件的吞吐量。

不幸的是,到目前为止,没有配置选项可以覆盖此行为。可能值得尝试的一种可能方法是将输出分区键的概念用于超级唯一的(即将此列添加到您的查询中 - GetMetadataPropertyValue(ehInput," EventId")作为outputpk)。现在指定" outputpk"在输出EventHub的ASA设置中作为PartitionKey。

如果有帮助,请告诉我。

欢呼声 Chetan

答案 1 :(得分:0)

我遇到了同样的问题。感谢您手动格式化输入消息的答案。我和我的同事用几行代码解决了这个问题,删除了换行和回车。然后我将“} {”替换为“},{”并通过向两端添加“[”和“]”使其成为一个数组。

  devise_for :users
  devise_for :admin_users, ActiveAdmin::Devise.config
  ActiveAdmin.routes(self)



  resources :overviews
  resources :users

  root 'overviews#index'

然后根据数据结构将输入作为对象列表:

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

....    ....