我能够使用数据工厂将数据从sql Azure成功复制到Azure cosmos DB。第一次复制后,我想保持它从相同的sql源更新,但这是问题所在:
假设我有一个这样的SQL表:
scala> List(1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20).toStream
res8: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> .map{x => println("Some req/res"); x}
Some req/res
res9: scala.collection.immutable.Stream[Int] = Stream(1, ?)
scala> .filter{_ % 2 == 0}
Some req/res
res10: scala.collection.immutable.Stream[Int] = Stream(2, ?)
scala> .take(3)
res11: scala.collection.immutable.Stream[Int] = Stream(2, ?)
scala> .toList
Some req/res
Some req/res
Some req/res
Some req/res
res13: List[Int] = List(2, 4, 6)
在数据工厂复制活动中,我选择SQL作为源,并选择cosmos DB作为目标。我选择了upsert选项进行复制。
在azure数据工厂的映射部分中,我设置了col1映射到我的cosmosdb集合的/ primarykey,而col2映射到col2。
现在,我执行了数据工厂管道。它成功复制了它,项目如下:
ID PartitionKey Document `SomeGuid1` val11 { Col2: val21 } `SomeGuid2` val12 { Col2: val22 } `SomeGuid3` val13 { Col2: val21 } `SomeGuid4` val11 { Col2: val23 }
ID PartitionKey Document `SomeGuid1` val11 { Col2: val21 } `SomeGuid2` val12 { Col2: val22 } `SomeGuid3` val13 { Col2: val21 } `SomeGuid4` val11 { Col2: val23 } `SomeGuid5` val11 { Col2: val25 } >-- changed value `SomeGuid6` val12 { Col2: val22 } `SomeGuid7` val13 { Col2: val21 } `SomeGuid8` val11 { Col2: val23 }
但是我不希望重复。我希望这只是复制并替换旧数据。因此,我希望第二次复制任务之后的数据为:
ID PartitionKey Document `SomeGuid5` val11 { Col2: val25 } >-- changed value `SomeGuid6` val12 { Col2: val22 } `SomeGuid7` val13 { Col2: val21 } `SomeGuid8` val11 { Col2: val23 }
我认为它正在复制所有行,因为upsert检查Id属性,但是由于源没有ID,它会生成一个,并且在第二个副本中,它还会生成新的ID并添加新的文档。
在SQL中执行此操作的方式是,先复制临时表,然后在完全复制后将表名与原始表交换。但是cosmos db不支持重命名容器:https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/19466575-add-ability-to-rename-databases-and-collections
任何帮助将不胜感激。我们喜欢cosmos db,我们将很乐意使用它。
答案 0 :(得分:1)
注意:如果未在原始文档或列映射中指定ID,则Data Factory会自动为该文档生成一个ID。这意味着您必须确保您的文档具有ID,以确保Upsert能够正常工作。
如果“ Col1”是用于标识重复项的唯一键,则应将其映射到 id 字段。您无需在 id 字段中使用Guid。
https://docs.microsoft.com/en-us/azure/data-factory/copy-activity-schema-and-type-mapping