Операция копирования данных в АПД - проверьте наличие дублирующих записей перед вставкой в ​​SQL дБ - PullRequest
0 голосов
/ 26 марта 2020

У меня очень простой конвейер ADF для копирования данных из локальной mongoDB (автономной среды интеграции) в базу данных Azure SQL.

Мой pipleline может копировать данные из mongoDB и вставлять в SQL db. В настоящее время, если я запускаю конвейер, он вставляет повторяющиеся данные, если выполняется несколько раз.

Я сделал столбец _id уникальным в базе данных SQL и теперь выполняю выбросы конвейера и ошибку из-за ограничения SQL, которое не позволяет ему вставлять запись.

Как проверить наличие дубликата _id перед вставкой в ​​SQL db?

следует ли использовать сценарий предварительной копии / хранимую процедуру? Некоторые указания / указания могут быть полезны для добавления дополнительных шагов. Спасибо

Ответы [ 4 ]

2 голосов
/ 26 марта 2020

Azure Фабрика данных Поток данных может помочь вам достичь этого:

enter image description here

Вы можете выполнить следующие действия:

  1. Добавьте два источника: таблицу базы данных Cosmos (source1) и таблицу базы данных SQL (source2).
  2. Использование Join active для получения всех данные из двух таблиц (левое соединение / полное соединение / правое соединение) на Cosmos table.id = SQL table.id. enter image description here

  3. AlterRow выражение для фильтрации дубликата _id, он не дублируется, затем вставьте его. enter image description here

  4. Затем сопоставление столбца без дубликатов с таблицей базы данных Sink SQL.

Надежда это помогает.

1 голос
/ 26 марта 2020

В настоящее время я получил решение, использующее хранимую процедуру, которая выглядит гораздо меньше работы, поскольку это требование касается.

Я следовал этой статье: https://www.cathrinewilhelmsen.net/2019/12/16/copy-sql-server-data-azure-data-factory/

Я создал тип таблицы и использовал ее в хранимой процедуре для проверки на наличие дубликатов.

мой spro c очень прост, как показано ниже:

SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[spInsertIntoDb]
    (@sresults dbo.targetSensingResults READONLY)
AS

BEGIN

MERGE dbo.sensingresults AS target
USING @sresults AS source
ON (target._id = source._id)

WHEN NOT MATCHED THEN
    INSERT (_id, sensorNumber, applicationType, place, spaceType, floorCode, zoneCountNumber, presenceStatus, sensingTime, createdAt, updatedAt, _v)
    VALUES (source._id, source.sensorNumber, source.applicationType, source.place, source.spaceType, source.floorCode,
     source.zoneCountNumber, source.presenceStatus, source.sensingTime, source.createdAt, source.updatedAt, source.updatedAt);
END

Я думаю, что использование хранимого pro c должно быть полезно, а также поможет в будущем, если мне нужно будет сделать больше преобразование.

Пожалуйста, дайте мне знать, если использование spro c в этом случае имеет потенциальный риск в будущем?

1 голос
/ 26 марта 2020

Вы должны реализовать свой SQL Logi c для устранения дублирования в сценарии предварительной копии enter image description here

0 голосов
/ 29 марта 2020

Для удаления дубликатов вы можете использовать скрипт предварительного копирования. ИЛИ что вы можете сделать - вы можете сохранить добавочные или новые данные во временной таблице, используя операцию копирования, и использовать процедуру сохранения, чтобы удалить только те идентификаторы из основной таблицы, которые находятся во временной таблице, после удаления вставьте данные временной таблицы в основную таблицу. Таблица. а затем удалите временную таблицу.

...