2016-06-01 11 views
2

こんにちは私は、ストリームアナリティクスのJSON入力の配列プロパティから特定の項目を選択し、それらをJSON出力の配列プロパティとして返すことができるのだろうかと思います。ストリームアナリティクスは配列プロパティの項目をフィルタリングできますか?

私の例でそれをより明確にする - 私は、バンドルの名前バージョン状態と、デバイス上で実行されているOSGI bundlesのリストを送信します。 (私はコンテンツの残りの部分を省略。)サンプルメッセージ:

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

経由ストリームAnalyticsを私はアクティブなバンドル(状態== 32)のための1つの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バージョンアクティブ出力でプロパティを含む元の配列の各アイテムの行がある。この方法。したがって、のdeviceIdプロパティが複数回コピーされます。これは、メッセージ内の追加データを意味します。私は元のJSON入力に似ているdeviceIdプロパティと1つの配列プロパティバンドルを持つ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

私はあなたがCollect()集約関数を使用してこれを達成できると思います。 私が見る唯一の問題は、deviceIdプロパティがバンドル配列にも出力されることです。

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 
+0

おかげさまで、以前は分かりませんでした** Collect()**機能のおかげで、別のクエリで使用することもできます。ただし、結果配列の各項目(および結果全体のプロパティ)には_deviceid_プロパティの重複があります。私の目標はデータを保存することだったので、これは悲しいことに私のニーズを満たしておらず、ソリューションの半分に過ぎません。 - / –

関連する問題