将 ADF Copy Activity 与动态架构映射结合使用

Using ADF Copy Activity with dynamic schema mapping

我正在尝试从数据库配置 table 中驱动 columnMapping 属性。我在管道中的第一个 activity 从配置 table 中提取行。我的副本 activity 源是 Azure blob 存储中的一个 Json 文件,我的接收器是一个 Azure SQL 数据库。

在副本 activity 中,我正在使用动态内容设置映射 window。代码如下所示:

"translator": {
    "value": "@json(activity('Lookup1').output.value[0].ColumnMapping)",
     "type": "Expression"
 }

我的问题是,activity('Lookup1').output.value[0].ColumnMapping 的值应该是什么样的?

我尝试了几种不同的 json 格式,但副本 activity 似乎总是忽略它。

例如,我试过:

{
    "type": "TabularTranslator",
    "columnMappings": {
      "view.url": "url"
    }
}

和:

"columnMappings": {
    "view.url": "url"
}

和:

{
  "view.url": "url"
}

在此示例中,view.url 是 JSON 源中的列名称,url 是我目标 table 中的列名称Azure SQL 数据库。

问题是由于您的列名称中的点 (.) 符号引起的。

  1. 要使用列映射,您还应该在源和汇数据集中指定结构。
  2. 对于源数据集,您需要正确指定格式。由于您的列名带有点,因此您需要指定 json 路径,如下所示。
  3. 您可以先使用ADF UI 为单个文件设置一个副本,以获得相关的格式、结构和列映射格式。然后改成查找。

据我了解,您的第一种格式应该是正确的格式。如果它已经是 json 格式,那么您可能不需要在表达式中使用 "json" 函数。

问题和答案似乎脱节了,所以我希望能提供一个更直接的答案。

设置时,您应该有一个带有动态映射的源数据集。接收器不需要,因为我们将在映射中指定它。

在副本 activity 中,按如下方式格式化动态 json:

    {
      "structure": [
        {
          "name": "Address Number"
        },
        {
          "name": "Payment ID"
        },
        {
          "name": "Document Number"
        },
          ...
          ...
      ]
    }

然后您可以像这样指定您的动态映射:

    {
      "translator": {
        "type": "TabularTranslator",
        "mappings": [
          {
            "source": {
              "name": "Address Number",
              "type": "Int32"
            },
            "sink": {
              "name": "address_number"
            }
          },
          {
            "source": {
              "name": "Payment ID",
              "type": "Int64"
            },
            "sink": {
              "name": "payment_id"
            }
          },
          {
            "source": {
              "name": "Document Number",
              "type": "Int32"
            },
            "sink": {
              "name": "document_number"
            }
          },
          ...
          ...
        ]
      }
    }

假设这些设置在单独的变量中,您可能希望将源作为字符串发送,并将映射作为 json:

来源:@string(json(variables('str_dyn_structure')).structure)

映射:@json(variables('str_dyn_translator')).translator

VladDrak - 您可以像这样构建动态映射来跳过源动态定义:

{
  "translator": {
    "type": "TabularTranslator",
    "mappings": [
      {
        "source": {
          "type": "String",
          "ordinal": "1"
        },
        "sink": {
          "name": "dateOfActivity",
          "type": "String"
        }
      },
      {
        "source": {
          "type": "String",
          "ordinal": "2"
        },
        "sink": {
          "name": "CampaignID",
          "type": "String"
        }
      }
    ]
  }
}