将7列表复制到6列表

时间:2017-07-25 13:09:23

标签: azure-data-factory

我将SQL Server Integration Services包移植到Azure Data Factory。

我有两个表(表1和表2),它们位于不同的服务器上。一个有七列,另外六个。我按照https://docs.microsoft.com/en-us/azure/data-factory/data-factory-map-columns

上的示例进行了操作

表1 DDL:

CREATE TABLE dbo.Table1
(
    zonename nvarchar(max), 
    propertyname nvarchar(max), 
    basePropertyid int, 
    dfp_ad_unit_id bigint, 
    MomentType nvarchar(200), 
    OperatingSystemName nvarchar(50)
)

表2 DDL

CREATE TABLE dbo.Table2
(
    ZoneID int IDENTITY, 
    ZoneName nvarchar(max), 
    propertyName nvarchar(max), 
    BasePropertyID int, 
    dfp_ad_unit_id bigint, 
    MomentType nvarchar(200), 
    OperatingSystemName nvarchar(50)
)

在ADF中,我将表1定义为:

{
  "$schema": "http://datafactories.schema.management.azure.com/schemas/2015-09-01/Microsoft.DataFactory.Table.json",
  "name": "Table1",
  "properties": {
    "type": "AzureSqlTable",
    "linkedServiceName": "PlatformX",
    "structure": [
      { "name": "zonename" },
      { "name": "propertyname" },
      { "name": "basePropertyid" },
      { "name": "dfp_ad_unit_id" },
      { "name": "MomentType" },
      { "name": "OperatingSystemName" }
    ],
    "external": true,
    "typeProperties": {
      "tableName": "Platform.Zone"
    },
    "availability": {
      "frequency": "Day",
      "interval": 1
    }
  }
}

在ADF中,我将表2定义为:

{
  "$schema": "http://datafactories.schema.management.azure.com/schemas/2015-09-01/Microsoft.DataFactory.Table.json",
  "name": "Table2",
  "properties": {
    "type": "SqlServerTable",
    "linkedServiceName": "BrixDW",
    "structure": [
      { "name": "ZoneID" },
      { "name": "ZoneName" },
      { "name": "propertyName" },
      { "name": "BasePropertyID" },
      { "name": "dfp_ad_unit_id" },
      { "name": "MomentType" },
      { "name": "OperatingSystemName" }
    ],
    "external": true,
    "typeProperties": {
      "tableName": "staging.DimZone"
    },
    "availability": {
      "frequency": "Day",
      "interval": 1
    }
  }
}

如您所见,Table2有一个标识列,它将自动填充。

这应该是一个简单的复制活动:

{
  "$schema": "http://datafactories.schema.management.azure.com/schemas/2015-09-01/Microsoft.DataFactory.Pipeline.json",
  "name": "Copy_Table1_to_Table2",
  "properties": {
    "description": "Copy_Table1_to_Table2",
    "activities": [
      {
        "name": "Copy_Table1_to_Table2",
        "type": "Copy",
        "inputs": [
          { "name": "Table1" }
        ],
        "outputs": [
          {
            "name": "Table2"
          }
        ],
        "typeProperties": {
          "source": {
            "type": "SqlSource",
            "sqlReaderQuery": "select * from dbo.Table1"
          },
          "sink": {
            "type": "SqlSink"
          },
          "translator": {
            "type": "TabularTranslator",
            "columnMappings": "zonename: ZoneName, propertyname: propertyName, basePropertyid: BasePropertyID, dfp_ad_unit_id: dfp_ad_unit_id, MomentType: MomentType, OperatingSystemName: OperatingSystemName"
          }
        },
        "policy": {
          "concurrency": 1,
          "executionPriorityOrder": "OldestFirst",
          "retry": 3,
          "timeout": "01:00:00"
        },
        "scheduler": {
          "frequency": "Day",
          "interval": 1
        }
      }
    ],
    "start": "2017-07-23T00:00:00Z",
    "end": "2020-07-19T00:00:00Z"
  }
}

我想通过不映射ZoneID,它只会被忽略。但是ADF给了我以下错误。

复制活动遇到用户错误:GatewayNodeName = APP1250S,ErrorCode = UserErrorInvalidColumnMappingColumnCountMismatch,' Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message =提供给复制活动的无效列映射:' zonename: ZoneName,propertyname:propertyName,basePropertyid:BasePropertyID,dfp_ad_unit_id:dfp_ad_unit_id,MomentType:MomentType,OperatingSystemName:OperatingSystemName',详细消息:目标结构和列映射之间的列数不同。目标列数:7,列映射计数:6。检查表定义中的列映射。,Source = Microsoft.DataTransfer.Common,'

简而言之,我试图将7列表复制到6列表,而数据工厂并不喜欢它。我怎样才能完成这项任务?

4 个答案:

答案 0 :(得分:2)

我意识到这是一个老问题,但我刚才遇到了这个问题。我的问题是我最初生成了目标/接收表,创建了一个管道,然后添加了一列。

尽管清除并重新导入模式,但每当触发管道时,它都会抛出上述错误。我确保在映射中取消选择新列(其上有默认值),因此它只使用默认值。错误仍然被抛出。

我设法让事情发挥作用的唯一方法是从头开始重新创建管道。它几乎就像元数据中的某个地方一样,保留了旧的映射。

答案 1 :(得分:1)

我有完全相同的问题,我通过进入azure数据集并删除标识列来解决它。然后确保我的源和目标(接收器)中的列数相同。执行此操作后,副本将添加记录,表中的标识将按预期工作。我不必修改SQL中的物理表,只需要修改azure中表的数据集。

答案 2 :(得分:0)

一种选择是在7列表上创建一个视图,该视图不包含标识列并插入到该视图中。

CREATE VIEW bulkLoad.Table2
AS
SELECT
    ZoneName, 
    propertyName, 
    BasePropertyID, 
    dfp_ad_unit_id, 
    MomentType, 
    OperatingSystemName
GO

我可以进行一些挖掘,看看列映射是否可以实现某些技巧但是应该解锁你。

HTH

答案 3 :(得分:0)

MSFT支持告诉我只是从表定义中删除标识列。它似乎有效。