Stream Analytics是否可以过滤数组属性的项目?

时间:2016-06-01 11:28:32

标签: arrays json azure-stream-analytics

嗨,我想知道是否可以从Stream Analytics的JSON输入的数组属性中选择某些项目,并将它们作为JSON输出的数组属性返回。

我的示例更清晰 - 我发送了一个OSGI bundles列表,其中包含名称版本州捆绑的em>。 (我遗漏了其他内容。)示例消息:

{"bundles":[{"name":"org.eclipse.osgi","version":"3.5.1.R35x_v20090827","state":32},{"name":"slf4j.log4j12","version":"1.6.1","state":4}]}

通过Stream Analytics我想为活动包(state == 32)创建一个JSON输出(事件中心),并将其余的输出放在不同的输出中。稍后将处理这些事件中心的内容。但是在处理过程中我还需要原始的设备ID ,所以我从IoTHub消息属性中获取它。

所以我的查询如下:

WITH Step1 AS
(
SELECT
    IoTHub.ConnectionDeviceId AS deviceId,
    bundles as bundles
FROM 
    iotHubMessages
)

SELECT
    messages.deviceId AS deviceId,
    bundle.ArrayValue.name AS name,
    bundle.ArrayValue.version AS version
INTO
    active
FROM 
    Step1 as messages
CROSS APPLY GetArrayElements(messages.bundles) AS bundle
WHERE 
    bundle.ArrayValue.state = 32

SELECT
    messages.deviceId AS deviceId,
    bundle.ArrayValue.name AS name,
    bundle.ArrayValue.version AS version
INTO
    other
FROM 
    Step1 as messages
CROSS APPLY GetArrayElements(messages.bundles) AS bundle
WHERE 
    bundle.ArrayValue.state != 32

这样,活动中包含 deviceId name version 属性的原始数组的每个项都有一行输出。因此, deviceId 属性会被多次复制,这意味着消息中会有其他数据。我更喜欢带有一个 deviceId 属性的JSON和一个数组属性 bundles ,类似于原始的JSON输入。

喜欢有效

{"deviceid":"javadevice","bundles":[{"name":"org.eclipse.osgi","version":"3.5.1.R35x_v20090827"}]}

其他

{"deviceid":"javadevice","bundles":[{"name":"slf4j.log4j12","version":"1.6.1"}]}

有没有办法实现这个目标? - 过滤数组项并将其作为数组返回,格式与输入中的格式相同。 (在我的代码中,我更改了属性数,但这不是必需的。)

感谢您的任何想法!

1 个答案:

答案 0 :(得分:0)

我认为你可以使用Collect()聚合函数来实现这一点。 我看到的唯一问题是deviceId属性也将在bundle数组中输出。

WITH Step1 AS
(
SELECT
    IoTHub.ConnectionDeviceId AS deviceId,
    bundles as bundles
FROM 
    iotHubMessages
),
Step2 AS 
(
SELECT
    messages.deviceId AS deviceId,
    bundle.ArrayValue.name AS name,
    bundle.ArrayValue.version AS version
    bundle.ArrayValue.state  AS state
FROM 
    Step1 as messages
CROSS APPLY GetArrayElements(messages.bundles) AS bundle
)

SELECT deviceId, Collect() AS bundles
FROM Step2
GROUP BY deviceId, state, System.Timestamp
WHERE state = 32