1

背景

我已经根据此处此处的教程使用 Azure 事件中心和 Azure 流分析 (ASA) 建立了一个 IoT 项目。JSON 格式的消息使用 webhook 从启用 wifi 的设备发送到事件中心,然后通过 ASA 查询提供,并根据它们来自的输入流存储在三个 Azure SQL 数据库之一中。

该设备 (Particle Photon) 传输 3 条具有不同有效负载的不同消息,为此定义了 3 个 SQL 表用于长期存储/分析。下一步包括实时警报和通过 Power BI 进行的可视化。

这是这个想法的直观表示: 物联网:粒子光子 + Azure

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 是合理的。

4

2 回答 2

1

ASA 应该用于复杂事件处理。您在查询中使用 ASA 从本质上将数据从事件中心传递到表。如果您实际上托管一个简单的“worker web 应用程序”来处理传入事件,它会便宜得多。

这篇博文涵盖了最佳实践:http: //blogs.msdn.com/b/servicebus/archive/2015/01/16/event-processor-host-best-practices-part-1.aspx

如果您实时对输入数据进行一些转换、过滤、轻量级分析,则 ASA 非常棒。此外,如果您有一些作为函数公开的 Azure 机器学习模型(当前处于预览状态),它也很有效。

于 2015-12-28T04:46:17.313 回答
1

在您的示例中,所有三个“select into”语句都从同一输入源读取,并且没有任何过滤器子句,因此将选择所有行。

如果您只想为每个输出选择特定行,则必须指定过滤条件。例如,假设您只想要输出“TpEnvStateOutputToSQL”的列“PH”中具有非空值的记录,那么 ASA 查询将如下所示

SELECT
    ParticleId,
    TimePublished,
    PH
    -- and other fields INTO TpEnvStateOutputToSQL FROM TpEnvStateInput WHERE PH IS NOT NULL
于 2015-12-28T18:49:46.543 回答