如何从 Azure 流分析仅将数据发送到一个 Azure SQL 数据库表?

Posted

技术标签:

【中文标题】如何从 Azure 流分析仅将数据发送到一个 Azure SQL 数据库表?【英文标题】:How to send data to only one Azure SQL DB Table from Azure Streaming Analytics? 【发布时间】:2015-12-27 23:33:35 【问题描述】:

背景

我根据 here 和 here 的教程使用 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 Documentation 我的理解是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 存在误解?

我希望不必定义三个单独的流分析容器,因为它们往往相当昂贵。在运行this tutorial 并让 4 个 ASA 容器运行一天后,我用掉了近 5 美元的 Azure 积分。预计每月 150 美元的成本,我没有理由坚持使用 Azure。

【问题讨论】:

【参考方案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 机器学习模型(当前处于预览状态),它也很有效。

【讨论】:

【参考方案2】:

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

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

SELECT
    ParticleId,
    TimePublished,
    PH
    -- and other fields INTO TpEnvStateOutputToSQL FROM TpEnvStateInput WHERE PH IS NOT NULL

【讨论】:

以上是关于如何从 Azure 流分析仅将数据发送到一个 Azure SQL 数据库表?的主要内容,如果未能解决你的问题,请参考以下文章

Azure 流分析:如何从我的客户端系统实时将图像摄取到 Azure 中心?

如何使用 Azure 流分析强制一个空的输出文件

无法根据 Azure 流分析中的标头属性筛选消息

如何有效地将压缩的 json 数据推送到 azure 事件中心并在 azure 流分析中处理?

如何使用基于分区键的 Azure 流分析查询数据

在 Azure 流分析中,如果发送失败,我在哪里可以看到失败的原因