В Фабрике данных Azure можно ли отфильтровать исходный запрос Операции копирования, используя столбец из другого источника?

#azure #odbc #azure-sql-database #azure-data-factory #azure-data-factory-2

Вопрос:

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

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

Случаи: Исходный ключ есть…

  • В раковине: Ничего не делай
  • Не в раковине: Добавить в раковину

Случай: Ключ от раковины есть…

  • Не в источнике: Удалить

Чтобы представить, к чему я стремлюсь…

введите описание изображения здесь

Однако моя проблема в том, что мой Источник и Приемник не одного типа. Источник = ODBC (улей), Приемник = База данных SQL Azure. Таким образом, в ADF вы не можете присоединиться к ним, а поиск ограничен 5000 строками.

Есть ли какой-нибудь способ решить эту проблему? В любом случае, чтобы использовать столбец одного в предложении Where другого?

Комментарии:

1. Привет@BriaNicole Пауэлл, пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

2. Привет @BriaNicole Пауэлл, пожалуйста, поправьте меня, если я неправильно понял вас в ответе. : )

3. В качестве альтернативы, существует ли какой-либо столбец ModifiedDate в исходных данных, чтобы вы извлекали измененные данные только с указанной даты?

Ответ №1:

Мы можем использовать СЛИЯНИЕ для достижения этой цели. Синтаксис слияния выглядит следующим образом:

 MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
    THEN update_statement
WHEN NOT MATCHED
    THEN insert_statement
WHEN NOT MATCHED BY SOURCE
 

введите описание изображения здесь

  1. Я также создал простой тест. Мой источник-emp.csv в моем озере данных Azure. Раковина-это мой SQL Azure. Я создаю таблицу и тип таблицы.
 CREATE TABLE [dbo].[emp](
    [id] [int] NOT NULL,
    [name] [varchar](20) NULL,
    [age] [int] NULL
)

CREATE TYPE [dbo].[EmpType] AS TABLE(
    [id] [int] NOT NULL,
    [name] [nvarchar](max) NOT NULL,
    [age] [nvarchar](max) NOT NULL
)
GO
 
  1. Затем я создаю хранимую процедуру для обновления и вставки строк. Здесь есть небольшая проблема: azure sql, похоже, не поддерживает операцию удаления после операции обновления. Поэтому я определил другую хранимую процедуру, предназначенную для операций удаления.
 CREATE PROCEDURE [dbo].[uspEmp]

@emp [dbo].[EmpType] READONLY

AS
        MERGE [dbo].[emp] AS target_sqldb

        USING @emp AS source_tblstg

        ON target_sqldb.id = source_tblstg.id 

        WHEN MATCHED THEN

        UPDATE SET

        target_sqldb.name = source_tblstg.name,

        target_sqldb.age = source_tblstg.age
        
        WHEN NOT MATCHED BY TARGET THEN 

        INSERT VALUES (

            source_tblstg.id,

            source_tblstg.name,

            source_tblstg.age
        );

        --WHEN NOT MATCHED BY SOURCE THEN
        --DELETE;

 
  1. В ADF мы можем использовать Copy activity1 для копирования строк в SQL Azure. Выберите сохраненную папку и нажмите Import parameter .
    введите описание изображения здесь
  2. Затем мы можем использовать Coy activity2 для удаления строк из SQL Azure.
 CREATE PROCEDURE [dbo].[deleteEmp]

@emp [dbo].[EmpType] READONLY

AS
        MERGE [dbo].[emp] AS target_sqldb

        USING @emp AS source_tblstg

        ON target_sqldb.id = source_tblstg.id 
        
        WHEN NOT MATCHED BY SOURCE THEN
        DELETE;

 

То же самое, выберите сохраненную папку и нажмите Import parameter .
введите описание изображения здесь

  1. Мой тест прошел успешно, в исходном коде не было удалено ни одной строки, в исходном коде были обновлены и вставлены строки.

Комментарии:

1. Ну, конечно … вы можете все это закодировать … или вы можете использовать действие потока данных.

Ответ №2:

Вы можете присоединиться к ним, отфильтровать и выполнить поиск в ADF. Но вы пытаетесь сделать все это в процессе копирования. Это именно тот вариант использования, для которого была создана операция потока данных: https://www.youtube.com/watch?v=GACpvMjOJgE

Комментарии:

1. Могу я спросить, можете ли вы сделать это с разными типами источников? Когда я попытался использовать функцию потока данных для соединений, она выделяет серым цветом соединения, отличные от Azure.

2. Для данных за пределами Azure вы должны сначала поместить их в учетную запись хранилища Azure с помощью операции копирования. Затем вы можете присоединиться к нему в своем потоке данных.