如何从Azure Streaming Analytics仅向一个Azure SQL DB表发送数据?
背景 我根据和的教程,使用Azure事件中心和Azure流分析(ASA)建立了一个物联网项目。JSON格式的消息使用Webhook从支持wifi的设备发送到事件中心,然后通过ASA查询发送,并根据它们来自的输入流存储在三个Azure SQL数据库之一 该设备(粒子光子)使用不同的有效载荷传输3条不同的消息,其中定义了3个SQL表用于长期存储/分析。下一步包括实时警报和通过Power BI进行可视化 以下是该想法的视觉表现: ASA查询如何从Azure Streaming Analytics仅向一个Azure SQL DB表发送数据?,sql,sql-server,azure,azure-stream-analytics,Sql,Sql Server,Azure,Azure Stream Analytics,背景 我根据和的教程,使用Azure事件中心和Azure流分析(ASA)建立了一个物联网项目。JSON格式的消息使用Webhook从支持wifi的设备发送到事件中心,然后通过ASA查询发送,并根据它们来自的输入流存储在三个Azure SQL数据库之一 该设备(粒子光子)使用不同的有效载荷传输3条不同的消息,其中定义了3个SQL表用于长期存储/分析。下一步包括实时警报和通过Power BI进行可视化 以下是该想法的视觉表现: ASA查询 SELECT ParticleId, Ti
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
问题:对于收到的每条消息,数据都会被推送到数据库中的所有三个表中,而不仅仅是查询中指定的输出。数据所属的表按预期填充新行,而其他两个表则为不存在数据的列填充空值
根据我的理解,INTO关键字会将输出定向到指定的接收器。但情况似乎并非如此,因为所有三个输入的输出都被推送到所有接收器(所有3个SQL表)
我为粒子光子编写的测试脚本将发送每种类型的消息,其中包含硬编码字段,顺序为:EnvState、Event、ConsLevels,间隔15秒,重复一次
以下是发送到所有表的输出示例,显示了每个表中的一列:
它是使用此查询生成的(在Visual Studio中):
对于TpEnvStateInput类型的输入事件,其中键“PH”将存在(而不是键“EventCode”或“淡水”,它们分别属于TpEventInput和TpConsLevelInput),只需要在环境状态表中输入一个条目
问题:
ASA查询中是否存在缺陷,或者我对如何使用/设置ASA存在误解
我希望我不必定义三个单独的流分析容器,因为它们往往相当昂贵。在运行完并让4个ASA容器运行一天之后,我在Azure中使用了将近5美元的积分。预计成本为150美元/月,我无法证明坚持使用Azure是合理的。ASA应该用于复杂事件处理。在查询中使用ASA基本上是将数据从事件中心传递到表。如果你真的拥有一个简单的“workerweb应用程序”来处理传入的事件,这会便宜得多 本博客文章介绍了以下最佳实践:
如果您正在对输入数据进行实时转换、过滤和灯光分析,ASA是非常棒的。此外,如果您有一些作为函数公开的Azure机器学习模型(当前处于预览中),它也非常有用。在您的示例中,所有三个“select into”语句都从相同的输入源读取,并且没有任何筛选子句,因此所有行都将被选中 如果只想为每个输出选择特定行,则必须指定筛选条件。例如,假设输出“tpenvstateouttosql”只需要列“PH”中具有非null值的记录,那么ASA查询如下所示
SELECT
ParticleId,
TimePublished,
PH
-- and other fields INTO TpEnvStateOutputToSQL FROM TpEnvStateInput WHERE PH IS NOT NULL
SELECT
ParticleId,
TimePublished,
PH
-- and other fields INTO TpEnvStateOutputToSQL FROM TpEnvStateInput WHERE PH IS NOT NULL