嗨,我想知道是否可以从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"}]}
有没有办法实现这个目标? - 过滤数组项并将其作为数组返回,格式与输入中的格式相同。 (在我的代码中,我更改了属性数,但这不是必需的。)
感谢您的任何想法!
答案 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