Azure流分析GetMetadataPropertyValue无法正常工作

问题描述 投票:0回答:3

我有一个模拟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由于某种原因丢弃标头。

不知道我在这里做错了什么。任何帮助,将不胜感激。

azure azure-iot-hub azure-stream-analytics
3个回答
1
投票

事实证明问题出在查询中。 GetMetaDataPropertyValue()有效但不像MSDN @ GetMetaDataPropertyValue上描述的那样。我必须将方法移动到我的where子句中才能使其成功运行。所以现在我的查询如下:

SELECT *
INTO OutputEH 
FROM InputEH as input
WHERE GetMetadataPropertyValue(input, '[User].[test]') = test

我不确定为什么在SELECT子句中这样做不起作用但这对我有用。


0
投票

在你的上一篇文章中,GetMetadataPropertyValue(input, '[User].[test]')为null,test也为null。所以在查询字符串中,section始终为true,这意味着它会将所有数据从InputEH输出到OutputEH。此外,您需要使用EventHub中的实时数据测试何时运行作业。


0
投票

对于遇到这个“问题”的任何其他人,您也可以通过这样做来获得您想要的东西:

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>'
© www.soinside.com 2019 - 2024. All rights reserved.