【问题标题】:Copying 7 column table to 6 column table将 7 列表复制到 6 列表
【发布时间】:2018-05-21 23:48:20
【问题描述】:

我正在将 SQL Server 集成服务包移植到 Azure 数据工厂。

我有两个表(表 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 列表,而数据工厂不喜欢它。我怎样才能完成这项任务?

【问题讨论】:

    标签: azure-data-factory


    【解决方案1】:

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

    尽管清除并重新导入架构,但无论何时触发管道,都会引发上述错误。我确保在映射中取消选择新列(上面有默认值),所以它只会使用默认值。错误仍然被抛出。

    我设法让事情正常工作的唯一方法是从头开始完全重新创建管道。就好像在元数据的某个地方,旧的映射被保留了。

    【讨论】:

    • 新发现:您还可以从接收器数据集中删除该列。只需选中复选框,向上滚动,然后单击删除按钮。
    【解决方案2】:

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

    【讨论】:

    • 是的,这对我也有用 - 更新数据集的逻辑映射,而不是物理表。来自 ADF 的愚蠢 UX...
    【解决方案3】:

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

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

    我可以进行一些挖掘,看看列映射是否可以使用一些技巧,但这应该会解除您的障碍。

    HTH

    【讨论】:

      【解决方案4】:

      MSFT 支持人员告诉我只需从表定义中删除标识列。它似乎奏效了。

      【讨论】:

      • 您的意思是来自 JSON 的 structure 组件吗?不清楚。
      猜你喜欢
      • 2012-02-12
      • 2022-01-06
      • 2013-09-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-09
      • 2021-11-21
      • 2010-10-29
      相关资源
      最近更新 更多