背景
我已经根据此处和此处的教程使用 Azure 事件中心和 Azure 流分析 (ASA) 建立了一个 IoT 项目。JSON 格式的消息使用 webhook 从启用 wifi 的设备发送到事件中心,然后通过 ASA 查询提供,并根据它们来自的输入流存储在三个 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
问题:对于收到的每条消息,数据都被推送到数据库中的所有三个表中,而不仅仅是查询中指定的输出。数据所属的表按预期填充了一个新行,而另外两个表则填充了不存在数据的列的 NULL。
从ASA 文档中,我了解到 INTO 关键字会将输出定向到指定的接收器。但情况似乎并非如此,因为所有三个输入的输出都被推送到所有接收器(所有 3 个 SQL 表)。
我为 Particle Photon 编写的测试脚本将发送带有硬编码字段的每种类型的消息之一,顺序为:EnvState、Event、ConsLevels,每隔 15 秒重复一次。
这是使用此查询生成的(在 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
对于 TpEnvStateInput 类型的输入事件,其中存在键“PH”(而不是键“EventCode”或“FreshWater”,它们分别属于 TpEventInput 和 TpConsLevelInput),只需要进入 EnvironmentState 表。
问题: ASA 查询中是否存在错误,或者我对如何使用/设置 ASA 存在误解?
我希望我不必定义三个单独的流分析容器,因为它们往往相当昂贵。在运行完本教程并让 4 个 ASA 容器运行一天后,我用掉了近 5 美元的 Azure 积分。预计每月 150 美元的成本,我无法证明坚持使用 Azure 是合理的。