Обновление данных cosmos db из sql azure

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

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

Col1   Col2
val11  val21
val12  val22
val13   val21
val11   val23
  1. При копировании фабрики данных я выбрал SQL в качестве источника и Cosmos DB в качестве места назначения. Для копирования выбрал вариант 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 }
  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 }

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

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

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

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

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


person Gyan Prakash    schedule 01.11.2019    source источник
comment
Это не похоже имеет какое-либо отношение к SQL Server, так почему вы его пометили?   -  person Larnu    schedule 02.11.2019
comment
Я копирую данные с сервера sql, который для этого является источником. Если кто-то знает sql и космос, оба могут ответить на это. Я удалил тег sql сейчас.   -  person Gyan Prakash    schedule 02.11.2019
comment
Я копирую данные с сервера sql, который является источником для этого. На самом деле вы не упоминаете об этом в своем вопросе. если это так, вы должны и должны указать, где находится этот источник SQL Server (он также находится в Azure? Это локальный экземпляр или на узле в сети?).   -  person Larnu    schedule 02.11.2019
comment
Это Sql Azure. Я отредактирую вопрос, чтобы отразить это.   -  person Gyan Prakash    schedule 02.11.2019


Ответы (1)


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

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

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

http://More%20information%20about%20column%20mapping

person Alex AIT    schedule 02.11.2019
comment
У меня нет ни одного уникального столбца, который служил бы идентификатором. Но я могу создать уникальный идентификатор, объединяющий несколько столбцов. Большое спасибо за ваше предложение! - person Gyan Prakash; 04.11.2019