从 sql azure 更新 cosmos db 数据
Update cosmos db data from sql azure
我能够使用数据工厂成功地将数据从 sql Azure 复制到 Azure cosmos DB。在第一次复制后,我想从相同的 sql 源更新它,但问题是:
假设我有一个像这样的 SQL table:
Col1 Col2
val11 val21
val12 val22
val13 val21
val11 val23
在数据工厂副本 activity 中,我选择 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 }
- 到此为止一切都很好。但是假设 SQL 数据已更改,第一行已变为 (val11 val25(Changed))。现在我想再次复制这个 sql table 到 cosmos DB。
- 当我再次 运行 数据工厂管道时,它会再次复制所有行并复制数据。
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 中的做法是复制一个临时文件 table,然后在完全复制后将 table 名称与原始 table 交换。但是 cosmos db 不支持重命名容器:https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/19466575-add-ability-to-rename-databases-and-collections
我们将不胜感激任何帮助。我们喜欢 cosmos db,我们会喜欢使用它。
Note: Data Factory automatically generates an ID for a document if an ID isn't specified either in the original document or by column mapping. This means that you must ensure that, for upsert to work as expected, your document has an ID.
如果 "Col1" 是您识别重复项的唯一键,您应该将其映射到 id 字段。您不需要为 id 字段使用 Guid。
https://docs.microsoft.com/en-us/azure/data-factory/copy-activity-schema-and-type-mapping
我能够使用数据工厂成功地将数据从 sql Azure 复制到 Azure cosmos DB。在第一次复制后,我想从相同的 sql 源更新它,但问题是:
假设我有一个像这样的 SQL table:
Col1 Col2
val11 val21
val12 val22
val13 val21
val11 val23
在数据工厂副本 activity 中,我选择 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 }
- 到此为止一切都很好。但是假设 SQL 数据已更改,第一行已变为 (val11 val25(Changed))。现在我想再次复制这个 sql table 到 cosmos DB。
- 当我再次 运行 数据工厂管道时,它会再次复制所有行并复制数据。
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 中的做法是复制一个临时文件 table,然后在完全复制后将 table 名称与原始 table 交换。但是 cosmos db 不支持重命名容器:https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/19466575-add-ability-to-rename-databases-and-collections
我们将不胜感激任何帮助。我们喜欢 cosmos db,我们会喜欢使用它。
Note: Data Factory automatically generates an ID for a document if an ID isn't specified either in the original document or by column mapping. This means that you must ensure that, for upsert to work as expected, your document has an ID.
如果 "Col1" 是您识别重复项的唯一键,您应该将其映射到 id 字段。您不需要为 id 字段使用 Guid。
https://docs.microsoft.com/en-us/azure/data-factory/copy-activity-schema-and-type-mapping