Обновите данные БД Cosmos из SQL Azure - PullRequest
0 голосов
/ 02 ноября 2019

Я могу успешно копировать данные из sql Azure в Azure cosmos DB, используя фабрику данных. После первой копии я хочу, чтобы она обновлялась из того же источника SQL, но вот проблема:

Предположим, у меня есть таблица SQL, подобная этой:

Col1   Col2
val11  val21
val12  val22
val13   val21
val11   val23
  1. В операции копирования фабрики данных я выбрал SQL в качестве источника и космическую БД в качестве места назначенияЯ выбрал опцию upsert для копирования.

  2. В разделе отображения фабрики данных Azure я установил col1, сопоставленный с / primarykey моей коллекции cosmosdb, и col2, сопоставленный с col2.

  3. Теперь я выполнил конвейер фабрики данных. Он успешно скопировал его и элементы выглядят следующим образом:

   ID            PartitionKey         Document
   `SomeGuid1`      val11              { Col2: val21 }
   `SomeGuid2`      val12              { Col2: val22 }
   `SomeGuid3`      val13              { Col2: val21 }
   `SomeGuid4`      val11              { Col2: val23 }
До этого момента все нормально. Но скажем, данные SQL изменились, и первая строка стала (val11 val25 (изменено)). Теперь я хочу снова скопировать эту таблицу sql в базу данных cosmos. Когда я снова запускаю конвейер фабрики данных, он снова копирует все строки и дублирует данные.
   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 }

Но я не хочу, чтобы это дублировалось. Я хочу, чтобы это просто скопировать и заменить старые данные. Поэтому я хочу, чтобы данные после 2-й задачи копирования были такими:

   ID            PartitionKey         Document
   `SomeGuid5`      val11              { Col2: val25 }  >-- changed value
   `SomeGuid6`      val12              { Col2: val22 }
   `SomeGuid7`      val13              { Col2: val21 }
   `SomeGuid8`      val11              { Col2: val23 }

Я думаю, что они дублируют все строки, потому что upsert проверяет свойство Id, но так как у источника нет Id, он генерирует один, а во 2-мСкопируйте также, он генерирует новые идентификаторы и добавляет новые документы.

То, как мы делаем это в SQL, мы копируем во временную таблицу, а затем меняем имя таблицы на оригинальную после полной копии. Но Cosmos db не поддерживает переименование контейнера: https://feedback.azure.com/forums/263030-azure-cosmos-db/suggestions/19466575-add-ability-to-rename-databases-and-collections

Любая помощь будет высоко оценена. Нам нравится Cosmos db, и мы будем любить его использовать.

1 Ответ

1 голос
/ 02 ноября 2019

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

Примечание. Фабрика данных автоматически создает идентификатор для документа, если идентификатор не указан ни в исходном документе, ни в сопоставлении столбцов. Это означает, что вы должны убедиться, что для правильной работы upsert ваш документ имеет идентификатор.

Если «Col1» - это ваш уникальный ключ, по которому вы идентифицируете дубликаты, вы должны сопоставить его с id field. Вам не нужно использовать Guids для поля id .

https://docs.microsoft.com/en-us/azure/data-factory/copy-activity-schema-and-type-mapping

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...