结合使用ADF复制活动和动态模式映射

时间:2018-07-02 19:41:50

标签: azure-data-factory

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

在复制活动中,我正在使用动态内容窗口设置映射。代码如下:

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

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

我尝试了几种不同的json格式,但是复制活动似乎总是忽略它。

例如,我尝试过:

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

和:

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

和:

{
  "view.url": "url"
}

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

3 个答案:

答案 0 :(得分:2)

问题是由于列名中的点(。)引起的。

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

据我所知,您的第一种格式应该是正确的格式。如果它已经是json格式,则您可能不需要在表达式中使用“ json”函数。

答案 1 :(得分:0)

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

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

在复制活动中,按如下所示格式化动态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

答案 2 :(得分:0)

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"
        }
      }
    ]
  }
}