Мы загружаем данные с локальных серверов баз данных в Azure Data Lake Storage 2-го поколения с помощью фабрики данных Azure и Databricks сохраняем их как паркетные файлы. При каждом запуске мы получаем только новые и измененные данные из последнего запуска и UPSERT в существующие паркетные файлы с помощью оператора databricks merge.
Теперь мы пытаемся переместить эти данные из паркетных файлов Azure Synapse. В идеале я бы хотел это сделать.
- Считайте данные инкрементной загрузки во внешнюю таблицу. (CETAS или КОПИЯ В)
- Используйте выше в качестве промежуточной таблицы.
- Объединить промежуточную таблицу с производственной таблицей.
Проблема в том, что оператор слияния недоступен в Azure Syanpse. Вот решение Microsoft предлагает для дополнительной загрузки
CREATE TABLE dbo.[DimProduct_upsert]
WITH
( DISTRIBUTION = HASH([ProductKey])
, CLUSTERED INDEX ([ProductKey])
)
AS
-- New rows and new versions of rows
SELECT s.[ProductKey]
, s.[EnglishProductName]
, s.[Color]
FROM dbo.[stg_DimProduct] AS s
UNION ALL
-- Keep rows that are not being touched
SELECT p.[ProductKey]
, p.[EnglishProductName]
, p.[Color]
FROM dbo.[DimProduct] AS p
WHERE NOT EXISTS
( SELECT *
FROM [dbo].[stg_DimProduct] s
WHERE s.[ProductKey] = p.[ProductKey]
)
;
RENAME OBJECT dbo.[DimProduct] TO [DimProduct_old];
RENAME OBJECT dbo.[DimProduct_upsert] TO [DimProduct];
По сути, отбрасывание и воссоздание производственной таблицы с помощью CTAS. Будет хорошо работать с небольшими таблицами измерений, но я опасаюсь по поводу больших таблиц фактов с сотнями миллионов строк с индексами. Любые предложения, как лучше всего выполнять инкрементную загрузку действительно больших таблиц фактов. Спасибо!