从SQL Azure更新Cosmos DB数据

时间:2019-11-01 23:51:50

标签: azure-sql-database azure-cosmosdb azure-data-factory-2

我能够使用数据工厂将数据从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)
  1. 在数据工厂复制活动中,我选择SQL作为源,并选择cosmos DB作为目标。我选择了upsert选项进行复制。

  2. 在azure数据工厂的映射部分中,我设置了col1映射到我的cosmosdb集合的/ primarykey,而col2映射到col2。

  3. 现在,我执行了数据工厂管道。它成功复制了它,项目如下:

   ID            PartitionKey         Document
   `SomeGuid1`      val11              { Col2: val21 }
   `SomeGuid2`      val12              { Col2: val22 }
   `SomeGuid3`      val13              { Col2: val21 }
   `SomeGuid4`      val11              { Col2: val23 }
  1. 直到这一点都没问题。但是,假设SQL数据已更改并且第一行已变为(val11 val25(Changed))。现在,我想再次将此sql表复制到cosmos DB。
  2. 当我再次运行数据工厂管道时,它将再次复制所有行并复制数据。
   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,我们将很乐意使用它。

1 个答案:

答案 0 :(得分:1)

https://docs.microsoft.com/en-us/azure/data-factory/connector-azure-cosmos-db#azure-cosmos-db-sql-api-as-sink

  

注意:如果未在原始文档或列映射中指定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