我将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列表,而数据工厂并不喜欢它。我怎样才能完成这项任务?
答案 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支持告诉我只是从表定义中删除标识列。它似乎有效。