如何使用 Azure 数据工厂将 SQL 表行转换为 CosmosDB NoSQL 中对象数组的第一个元素

问题描述 投票:0回答:1

我有一个包含 3 列的表:ID、A 和 B,我需要将数据转换为具有特定结构的 CosmosDB 文档。所需的结构如下:

{
  "id": ID (value from the ID column),
  "values": [{"key": A (value from the A column), "value": B (value from the B column)}]
}

为了实现这一目标,我利用了 Azure 数据工厂中的复制活动。

我尝试在映射中使用 ['values']['key'] 和 ['values']['value'] 等路径表达式来完成此操作,但每次我最终都会得到一个对象而不是包含对象和的数组不支持此语法 ['values'][0]['key']。

错误消息:JSON 路径“$['predictedIncidenceRates'][0]['key']”不正确。模式映射接收器不支持像 [0] 这样的数组访问器。

我尝试使用映射数据流表达式生成器使用此表达式创建派生列:

[
  {
    "id": key,
    "key": name,
    "value": sortOrder
  }
]

但是,这导致了错误。

任何人都可以提供有关如何根据给定要求正确构建 CosmosDB 文档的指导吗?此外,如果有更好的方法或任何替代解决方案,我将不胜感激。谢谢!

azure-data-factory azure-cosmosdb
1个回答
0
投票

错误消息:JSON 路径“$['predictedIncidenceRates'][0]['key']”不正确。模式映射接收器不支持像 [0] 这样的数组访问器。

当我们在映射活动中删除数组访问器

[0]
时,上述错误就得到解决,如下所示。 enter image description here

当在以下输出中删除

[0]
时,它就成功了: enter image description here

我存储在 Azure SQL 数据库中的示例数据:

Id  A   B
1   a1  b1
2   a2  b2
3   a3  b3
4   a4  b4
5   a5  b5
6   a6  b6
7   a7  b7
8   a8  b8
9   a9  b9
10  a10 b10

Azure Cosmos DB 中的输出:

正如您在下面的输出中看到的,Azure SQL DB 中表格格式的数据已转换为分层模式

{
    "id": "1",
    "values": {
        "key": "a1",
        "value": "b1"
    }
},
{
    "id": "2",
    "values": {
        "key": "a2",
        "value": "b2"
    }
},
.
.
.
.,
{
    "id": "10",
    "values": {
        "key": "a10",
        "value": "b10"
    }
}

要在 cosmos db 中写入对象数组,可以使用 ADF 中的数据流。下面是方法:

  • 将源作为 Azure SQL 并通过执行

    Group By
    Id 进行聚合,并使用 Values 进行聚合。

  • collect(@(Key=A, Value=B))

    中使用
    Expression
    来存储对象数组,如下所示:

enter image description here

  • Sink
    使用 Azure Cosmos DB,允许其插入到 Cosmos 容器中,然后以数组格式存储,如下所示:

enter image description here

Azure Cosmos DB 中的输出:

正如您在下面的输出中看到的,Azure SQL DB 中表格格式的数据已通过以数组格式存储对象来转换为分层模式。

{
    "Id": 1,
    "Values": [
        {
            "Key": "a1",
            "Value": "b1"
        }
    ]
},
{
    "Id": 2,
    "Values": [
        {
            "Key": "a2",
            "Value": "b2"
        }
    ]
},
.
.
.
.
.,
{
    "Id": 10,
    "Values": [
        {
            "Key": "a10",
            "Value": "b10"
        }
    ]
}
© www.soinside.com 2019 - 2024. All rights reserved.