从 IOT 中心到 Azure SQL 数据库中的多个表
From IOT hub to multiple tables in an Azure SQL database
我有一个物联网集线器,其中包含将传感器数据推送给它的设备,存储在 SQL 数据库中。这似乎很容易通过流分析作业来完成。
然而,棘手的部分如下。我推送的数据未标准化,并且由于我使用的是 SQL 数据库,所以我想在多个 table 之间构建它。使用流分析,这似乎不是一件容易的事。
这是我推送到 IOT 中心的有效负载示例:
{
"timestamp" : "2019-01-10 12:00",
"section" : 1,
"measurements" :
{
"temperature" : 28.7,
"height" : 280,
"ec" : 6.8
},
"pictures" : {
"101_a.jpg",
"102_b.jpg",
"103_c.jpg"
}
}
我的数据库有 table Measurement、MeasurementItem 和 Picture。我想将时间戳和部分存储在 Measurement 记录中,温度、高度和 ec 存储在 MeasurementItem 记录中,图片存储在 图片table。
填充一个 table 很容易,但是要填充第二个 table 我需要上一条记录生成的自动递增 ID 以保持关系完整。
流分析真的可以吗?如果不能,我应该怎么做?
出于多种原因,您不应该尝试使用流分析 (SA)。它不是为这样的工作负载而设计的,因为否则 SA 将无法执行其如此高效的工作。它只是根据输入数据将数据发送到一个或多个接收器。
我建议将数据传递给能够在输出端执行逻辑的组件。有一些选择。 2 个示例可能是:
Azure Function
(通过指向 IoT 中心内置端点的服务总线触发器,如 here 所述)
- 在您写入 IoT 数据的存储上基于事件网格的触发器(因此您可以再次使用 Azure 函数,但让它由来自存储帐户的事件触发)
此解决方案还附带一个价格,即每个传入的数据包将调用一个逻辑单元,您必须为此额外付费。请注意,Azure Functions 上有一些计费选项,这些选项不取决于调用量,而是以更类似于应用服务的模型为您提供逻辑。
如果您有大量数据要处理,您可能会考虑使用 Data Lake Storage Account in combination with Data Lake Analytics 的架构。后者也可以收集、聚合并将您的传入数据分发到不同的数据存储中。
我最终得到了一个带有 IoT 中心触发器的 Azure 函数。该函数使用 EF Core 将 JSON 消息存储在 SQL 数据库中,分布在多个 table 中。我有点不喜欢这种方法,因为它引入了额外的逻辑,我希望为此付出额外的代价。
事实似乎恰恰相反。对于 Azure Functions,前 400,000 GB/s 次执行和 1,000,000 次执行是免费的。此外,此解决方案提供了额外的灵活性和控制,因为单个 table 限制不再适用。
我有一个物联网集线器,其中包含将传感器数据推送给它的设备,存储在 SQL 数据库中。这似乎很容易通过流分析作业来完成。
然而,棘手的部分如下。我推送的数据未标准化,并且由于我使用的是 SQL 数据库,所以我想在多个 table 之间构建它。使用流分析,这似乎不是一件容易的事。
这是我推送到 IOT 中心的有效负载示例:
{
"timestamp" : "2019-01-10 12:00",
"section" : 1,
"measurements" :
{
"temperature" : 28.7,
"height" : 280,
"ec" : 6.8
},
"pictures" : {
"101_a.jpg",
"102_b.jpg",
"103_c.jpg"
}
}
我的数据库有 table Measurement、MeasurementItem 和 Picture。我想将时间戳和部分存储在 Measurement 记录中,温度、高度和 ec 存储在 MeasurementItem 记录中,图片存储在 图片table。 填充一个 table 很容易,但是要填充第二个 table 我需要上一条记录生成的自动递增 ID 以保持关系完整。
流分析真的可以吗?如果不能,我应该怎么做?
出于多种原因,您不应该尝试使用流分析 (SA)。它不是为这样的工作负载而设计的,因为否则 SA 将无法执行其如此高效的工作。它只是根据输入数据将数据发送到一个或多个接收器。
我建议将数据传递给能够在输出端执行逻辑的组件。有一些选择。 2 个示例可能是:
Azure Function
(通过指向 IoT 中心内置端点的服务总线触发器,如 here 所述)- 在您写入 IoT 数据的存储上基于事件网格的触发器(因此您可以再次使用 Azure 函数,但让它由来自存储帐户的事件触发)
此解决方案还附带一个价格,即每个传入的数据包将调用一个逻辑单元,您必须为此额外付费。请注意,Azure Functions 上有一些计费选项,这些选项不取决于调用量,而是以更类似于应用服务的模型为您提供逻辑。
如果您有大量数据要处理,您可能会考虑使用 Data Lake Storage Account in combination with Data Lake Analytics 的架构。后者也可以收集、聚合并将您的传入数据分发到不同的数据存储中。
我最终得到了一个带有 IoT 中心触发器的 Azure 函数。该函数使用 EF Core 将 JSON 消息存储在 SQL 数据库中,分布在多个 table 中。我有点不喜欢这种方法,因为它引入了额外的逻辑,我希望为此付出额外的代价。
事实似乎恰恰相反。对于 Azure Functions,前 400,000 GB/s 次执行和 1,000,000 次执行是免费的。此外,此解决方案提供了额外的灵活性和控制,因为单个 table 限制不再适用。