Azure 流分析 GetMetadataPropertyValue 不工作

Azure Stream Analytics GetMetadataPropertyValue not working

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

我在 "simulator" 中有以下内容:

  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 中,而是将其放在消息 body 中,如果我的查询使用 "WHERE InputEh.test = 'test'",它会按预期工作

为了验证属性,我将输出设置为一个事件集线器并在其上设置了一个事件中心处理器,如果我删除了 "WHERE" 子句,消息就会进入。在事件中心处理器中,headers 似乎已被删除,这告诉我 ASA 出于某种原因正在删除 headers。

不确定我做错了什么。任何帮助将不胜感激。

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

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

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

在你最后的post中,GetMetadataPropertyValue(input, '[User].[test]')为空,test也为空。所以在查询字符串中,where 部分始终为真,这意味着它将把 InputEH 中的所有数据输出到 OutputEH。 而且,您需要在 运行 工作时使用来自 EventHub 的实时数据进行测试。

对于遇到此问题的任何其他人 "problem" 您也可以通过执行以下操作来获得您想要的东西:

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