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

标签 sql sql-server azure azure-stream-analytics

背景

我已经根据 here 中的教程使用 Azure 事件中心和 Azure 流分析 (ASA) 设置了一个 IoT 项目。和 here 。 JSON 格式的消息使用 Webhook 从支持 wifi 的设备发送到事件中心,然后通过 ASA 查询馈送这些消息,并根据它们来自的输入流存储在三个 Azure SQL 数据库之一中。

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

这是这个想法的直观表示: IoT: Particle Photon + 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 Documentation据我了解,INTO 关键字会将输出定向到指定的接收器。但情况似乎并非如此,因为所有三个输入的输出都被推送到所有接收器(所有 3 个 SQL 表)。

我为粒子光子编写的测试脚本将发送带有硬编码字段的每种类型的消息之一,顺序为:EnvState、Event、ConsLevels,每间隔 15 秒,重复。

以下是发送到所有表的输出示例,显示每个表中的一列: enter image description here

这是使用此查询生成的(在 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), 需要环境状态表。

问题: ASA 查询中是否存在错误,或者我对如何使用/设置 ASA 存在误解?

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

最佳答案

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

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

如果您要对输入数据进行实时转换、过滤和简单分析,ASA 会非常有用。此外,如果您有一些作为函数公开的 Azure 机器学习模型(当前处于预览版),它也非常有用。

关于sql - 如何从 Azure 流分析仅将数据发送到一个 Azure SQL DB 表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34486017/

相关文章:

sql-server - SQL Server AND 和 OR 优先级

python-2.7 - 无法在 Azure LAMP shell 服务器上使用 pip 安装 Python 包

c# - Azure Functions从调用端点获取参数

Azure Function 应用程序定期不会在触发器或计时器上触发

sql - PostgreSQL 和队列命令

sql - 使用 Linq to SQL 在 SQL 2008 中仅搜索日期的时间部分

sql-server - SQL Server ReportServer 服务不断要求在浏览器中提供凭据

SQL 服务器 2012 : Add a linked server to PostgreSQL

php - 如何以最短的运行时间执行sql select查询

php - 如何有效地同时哈希多个密码?