我有一个模拟iot设备的.net应用程序。它使用Microsoft.Azure.Devices.Client创建设备消息并将它们发送到iothub,然后将其路由到事件中心,Azure Stream Analytics将其作为输入。
我在“模拟器”中有以下内容:
messageToSend = new Message(Encoding.ASCII.GetBytes(JsonConvert.SerializeObject(message.Payload)))
{
MessageId = new Guid().ToString(),
ContentType = "application/json",
ContentEncoding = "utf-8",
};
messageToSend.Properties.Add("test", "test");
在我的azure流分析查询中,我有:
SELECT *, GetMetadataPropertyValue(InputEH, '[User].[test]') as test
INTO OutputEH
FROM InputEH
WHERE test = 'test'
由于某种原因,查询从不向OutputEH输出任何数据。我尝试了相同的查询,除了不将“test”属性添加到MessageProperties我已将它放在消息体中,如果我的查询使用“WHERE InputEh.test ='test'”,它会按预期工作
为了验证属性,我将输出设置为eventhub,并在其上设置一个事件中心处理器,如果删除“WHERE”子句,消息就会进入。在事件中心处理器中,似乎已删除标头,这告诉我ASA由于某种原因丢弃标头。
不知道我在这里做错了什么。任何帮助,将不胜感激。
事实证明问题出在查询中。 GetMetaDataPropertyValue()有效但不像MSDN @ GetMetaDataPropertyValue上描述的那样。我必须将方法移动到我的where子句中才能使其成功运行。所以现在我的查询如下:
SELECT *
INTO OutputEH
FROM InputEH as input
WHERE GetMetadataPropertyValue(input, '[User].[test]') = test
我不确定为什么在SELECT子句中这样做不起作用但这对我有用。
在你的上一篇文章中,GetMetadataPropertyValue(input, '[User].[test]')
为null,test
也为null。所以在查询字符串中,section始终为true,这意味着它会将所有数据从InputEH输出到OutputEH。此外,您需要使用EventHub中的实时数据测试何时运行作业。
对于遇到这个“问题”的任何其他人,您也可以通过这样做来获得您想要的东西:
WITH AllData AS (
SELECT
utctime,
GetMetadataPropertyValue(EventHubInput, '[User].[StreamID]') as streamid,
GetMetadataPropertyValue(EventHubInput, '[User].[CustomerID]') as customerid,
message
FROM
EventHubInput timestamp by utcTime
)
SELECT *
INTO EventOutput
FROM AllData
WHERE customerId = '<some value>' and streamId = '<some other value>'