如何从 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 中心?