Azure Synapse - добавочная загрузка данных

Мы загружаем данные с локальных серверов баз данных в 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. Будет хорошо работать с небольшими таблицами измерений, но я опасаюсь по поводу больших таблиц фактов с сотнями миллионов строк с индексами. Любые предложения, как лучше всего выполнять инкрементную загрузку действительно больших таблиц фактов. Спасибо!




Ответы (1)


До тех пор, пока не будет официально поддерживаться SQL MERGE, для обновления целевых таблиц рекомендуется использовать команды вставки / обновления T SQL между дельта-записями и целевой таблицей.

В качестве альтернативы вы также можете использовать отображение потоков данных (в ADF) для эмуляции транзакций SCD для загрузки данных измерений / фактов.

person Raunak Jhawar    schedule 13.09.2020