Использование дельта-таблиц в выделенных / бессерверных пулах SQL Azure Synapse

В настоящее время я работаю младшим разработчиком данных и недавно увидел сообщение о том, что Azure Synapse теперь может создавать таблицы SQL из таблиц Delta. Я попытался создать таблицу SQL из таблицы Delta, которая находится внутри Delta lake Storage V2, но таблица заполняется дополнительными избыточными данными (всеми данными из всех снимков в папке) при использовании PARQUET в качестве формата файла и подстановочный знак для чтения файлов.

Я попытался создать внешний формат файла для своей таблицы, но Synapse не принимает DELTA в качестве типа данных. Я использовал «ПАРКЕТ» в качестве формата файла и использовал ВАКУУМ в своей таблице Дельта, чтобы сохранить только последний ее снимок. Каждый раз, когда я устанавливал путь к определенному файлу или когда в таблице Delta был только один файл snappy.parquet, данные распечатывались правильно.

В принципе, есть ли способ создать таблицу Synapse / внешнюю таблицу, которая получает данные из таблицы Delta? Если нет, есть ли способ остановить Azure Deltalake от создания нового снимка каждый раз, когда новые данные записываются / обновляются / удаляются?

Используемый скрипт:

IF NOT EXISTS (SELECT * FROM sys.external_file_formats WHERE name = SynapseParquetFormat') 
CREATE EXTERNAL FILE FORMAT [SynapseParquetFormat] 
WITH ( FORMAT_TYPE = PARQUET)
GO

IF NOT EXISTS (SELECT * FROM sys.external_data_sources WHERE name = 'ExtSource') 
CREATE EXTERNAL DATA SOURCE [ExtSource] 
WITH (
    LOCATION   = '*', 
)
GO

CREATE EXTERNAL TABLE dbo.ext_table (
    [CostCentre] varchar(8000),
    [CostCentre_MemberId] int
)
WITH (
    LOCATION = 'dimensions/Dim_Example/*.snappy.parquet',
    -- WILDCARD IF THERE IS ONLY ONE FILE OR LATEST FILE NEEDS TO BE SPECIFIED
    DATA_SOURCE = [ExtSource],
    FILE_FORMAT = [SynapseParquetFormat]
)
GO

/ * '*' используется, потому что использовались пути к данным клиентов * /


person Kieran Goodlip    schedule 26.02.2021    source источник


Ответы (2)


Дельта не поддерживается в Synapse. Вы можете проголосовать за этот элемент здесь: https://feedback.azure.com/forums/307516-azure-synapse-analytics/suggestions/41120794-delta-lake-support-to-sql-on-demand

В бессерверном пуле есть несколько обходных путей:

Вы можете использовать этот сценарий PowerShell для создания представления DeltaLake на основе текущих данных: https://github.com/JocaPC/tsql-delta-lake-view/blob/main/GenDeltaLakeView.ps1

Обратите внимание, что вам нужно будет повторно сгенерировать представление, если данные изменятся.

В качестве альтернативы вы можете создать дельта-представление на основе файла манифеста: https://giangnt2.medium.com/directly-reading-delta-lake-data-from-azure-synapse-8b911dce2bcd

Если что-то изменится, вам снова нужно будет сгенерировать его.

person Jovan MSFT    schedule 17.03.2021

В настоящее время в выделенном пуле SQL Azure Synapse для внешних таблиц нет DELTA-формата. Вы не можете создать таблицу в пуле SQL, которая может читать дельта-формат. Несмотря на то, что вы можете решить свою проблему с помощью формата PARQUET и использовать Vacuum, как вы упомянули, это не рекомендуемое решение для повседневных операций с данными. Из документации Databricks:

Мы не рекомендуем устанавливать интервал хранения короче 7 дней, потому что старые снимки и незафиксированные файлы все еще могут использоваться параллельными программами чтения или записи в таблицу. Если вакуум очищает активные файлы, одновременные чтения могут выйти из строя или, что еще хуже, таблицы могут быть повреждены, когда вакуум удаляет файлы, которые еще не зафиксированы. https://docs.databricks.com/delta/delta-utility.html

И чтобы ответить на ваш второй вопрос, я не знаю никакого решения, чтобы прекратить создание снимков. Одна из ключевых функций Delta Lake - предоставление этих снимков.

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

  1. С фабрикой данных у вас есть встроенный коннектор для дельта-таблиц, но вам понадобится кластер Databricks для подключения и чтения данных с помощью фабрики данных. Используйте операцию копирования или сопоставление потока данных для чтения из Delta и записи в пул SQL. В качестве альтернативы, чтение из Delta, запись в Parquet и создание внешней таблицы в SQL Pool.

  2. Второй вариант - использовать Spark-приложение. Считайте данные из дельта-таблицы в Spark DataFrame и запишите их в пул SQL.

Размещение приложения Spark может осуществляться либо в Azure Databricks, либо в пулах Spark для Azure Synapse Analytics. Для Azure Databricks существует Azure Synapse Connector, дополнительная информация здесь: https://docs.databricks.com/data/data-sources/azure/synapse-analytics.html#language-python

person Dholmgren    schedule 01.03.2021