バックグラウンド
こことここのチュートリアルに基づいて、Azure Event Hub と Azure Stream Analytics (ASA) を使用して IoT プロジェクトをセットアップしました。JSON 形式のメッセージは、webhook を使用して Wi-Fi 対応デバイスからイベント ハブに送信されます。メッセージは ASA クエリを介してフィードされ、送信元の入力ストリームに基づいて 3 つの Azure SQL データベースのいずれかに格納されます。
デバイス (Particle Photon) は、異なるペイロードを持つ 3 つの異なるメッセージを送信します。これらのメッセージには、長期保存/分析用に定義された 3 つの SQL テーブルがあります。次のステップには、リアルタイム アラートと、Power BI による視覚化が含まれます。
ASA クエリ
SELECT
ParticleId,
TimePublished,
PH,
-- and other fields
INTO TpEnvStateOutputToSQL
FROM TpEnvStateInput
SELECT
ParticleId,
TimePublished,
EventCode,
-- and other fields
INTO TpEventsOutputToSQL
FROM TpEventsInput
SELECT
ParticleId,
TimePublished,
FreshWater,
-- and other fields
INTO TpConsLevelOutputToSQL
FROM TpConsLevelInput
問題:メッセージを受信するたびに、クエリで指定された出力だけでなく、データベース内の3 つのテーブルすべてにデータがプッシュされます。データが属するテーブルには期待どおりに新しい行が取り込まれますが、他の 2 つのテーブルにはデータが存在しない列の NULL が取り込まれます。
ASAのドキュメントから、INTO キーワードが出力を指定されたシンクに送信することを理解していました。しかし、3 つの入力すべてからの出力がすべてのシンク (3 つの SQL テーブルすべて) にプッシュされるため、そうではないようです。
Particle Photon 用に私が書いたテスト スクリプトは、ハードコーディングされたフィールドを持つ各タイプのメッセージを、EnvState、Event、ConsLevels の順に 15 秒間隔で繰り返し送信します。
すべてのテーブルに送信される出力の例を次に示します。各テーブルの 1 つの列が示されています。
このクエリを使用して生成されたもの (Visual Studio):
SELECT
t1.TimePublished as t1_t2_t3_TimePublished,
t1.ParticleId as t1_t2_t3_ParticleID,
t1.PH as t1_PH,
t2.EventCode as t2_EventCode,
t3.FreshWater as t3_FreshWater
FROM dbo.EnvironmentState as t1, dbo.Event as t2, dbo.ConsumableLevel as t3
WHERE t1.TimePublished = t2.TimePublished AND t2.TimePublished = t3.TimePublished
キー 'PH' が存在する (それぞれ TpEventInput および TpConsLevelInput に属するキー 'EventCode' または 'FreshWater' ではない) タイプ TpEnvStateInput の入力イベントの場合、EnvironmentState テーブルのみへのエントリが必要です。
質問: ASA クエリのどこかにバグがありますか、それとも ASA の使用方法/セットアップ方法に関する私の誤解ですか?
3 つの別個の Stream Analytics コンテナーを定義する必要がないことを望んでいました。このチュートリアルを実行し、4 つの ASA コンテナーを 1 日実行したままにした後、5 ドル近くの Azure クレジットを使い果たしました。予測される月額 150 ドルのコストでは、Azure を使い続けることを正当化する方法はありません。