#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
- Я также создал простой тест. Мой источник-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
- Затем я создаю хранимую процедуру для обновления и вставки строк. Здесь есть небольшая проблема: 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;
- В ADF мы можем использовать
Copy activity1
для копирования строк в SQL Azure. Выберите сохраненную папку и нажмитеImport parameter
.
- Затем мы можем использовать
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. Ну, конечно … вы можете все это закодировать … или вы можете использовать действие потока данных.
Ответ №2:
Вы можете присоединиться к ним, отфильтровать и выполнить поиск в ADF. Но вы пытаетесь сделать все это в процессе копирования. Это именно тот вариант использования, для которого была создана операция потока данных: https://www.youtube.com/watch?v=GACpvMjOJgE
Комментарии:
1. Могу я спросить, можете ли вы сделать это с разными типами источников? Когда я попытался использовать функцию потока данных для соединений, она выделяет серым цветом соединения, отличные от Azure.
2. Для данных за пределами Azure вы должны сначала поместить их в учетную запись хранилища Azure с помощью операции копирования. Затем вы можете присоединиться к нему в своем потоке данных.