Azure Stream Analytics GetMetadataPropertyValue 不起作用



我有一个模拟物联网设备的.net应用程序。它使用 Microsoft.Azure.Devices.Client 创建设备消息并将其发送到 iothub,然后将它们路由到 Azure 流分析将其作为输入的事件中心。

我在"模拟器"中有以下内容:

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'",它会按预期工作

为了验证属性,我将输出设置为事件中心,并在其上设置事件中心处理器,并在消息传入时删除"WHERE"子句。在事件中心处理器中,标头似乎已被删除,这告诉我 ASA 出于某种原因正在删除标头。

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

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

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

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

对于遇到这个"问题"的任何其他人,你也可以通过做这样的事情来得到你想要的:

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>'

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

最新更新