首页 > 解决方案 > Azure 数据工厂:从 blob 读取文件一次并将其放入两个数据库

问题描述

我需要从blob中读取一次带有JSON的文件,然后进行一些转换,将一部分放入数据库A,另一部分放入数据库B。

假设我有一个包含以下内容的文件

{
  "SerialNumber": "FAKE1",
  "Connected": true,
  "Timestamp":1616148596068,
  "Sensors": [
    {
      "Number": "631",
      "Value": 9
    },
    {
      "Number": "600",
       "Value": 44
    }
  ]
}

作为数据库,我使用 Cosmos DB。

应插入数据库 A:

{
   "SerialNumber": "FAKE1",
   "Connected": true,
   "Timestamp":1616148596068
}

应向数据库 B 插入 2 行:

{
   "SerialNumber": "FAKE1",
   "Timestamp":1616148596068,
   "Number": "631",
   "Value": 9
}
{
   "SerialNumber": "FAKE1",
   "Timestamp":1616148596068,
   "Number": "600",
   "Value": 44
}

如何在 Azure 数据工厂数据流中进行配置?我尝试使用复制数据活动。在这种情况下,我需要 2 个几乎相同的活动来读取同一个文件两次。

然后我尝试使用 * Data flow。但不知道如何 foreach 数组并将每一行作为单独的值插入 DB。我可以使用什么功能。有人可以帮忙吗?

在此处输入图像描述

如果我需要添加更多信息,请告诉我。先感谢您

标签: azureazure-data-factory

解决方案


数据流是声明性的,这意味着您不会编写像管道这样的过程逻辑。通过行进行迭代是隐式发生的。我假设您正在读取一个 JSON 文件,并且您希望将标头写入一个数据库并将详细信息拆分到另一个数据库中。

Dataflow 将读取一次数据并并行写入两个数据库。

您将把标头信息提取到 DB1 中,并使用 flatten tx 提取详细信息以写入 DB2。

DSL 脚本片段看起来像

HeartBeats foldDown(unroll(Sensors), 
                   mapColumn(
                          SerialNumber, 
                          Timestamp, 
                          Sensors.Number,
                          Sensors.Value) 
                ) ~> HeartBeatsFlattened

推荐阅读