在 Azure Synapse 专用/无服务器 SQL 池中使用增量表

问题描述

我目前是一名初级数据开发人员,最近看到一篇帖子说 Azure Synapse 现在可以从 Delta 表创建 sql 表。我尝试从 Delta Lake Storage V2 内的 Delta 表创建一个 sql 表,但是当使用“PARQUET”作为文件格式时,该表被填充了额外的冗余数据(来自文件夹中所有快照的所有数据)和读取文件通配符。

我尝试为我的表创建外部文件格式,但 Synapse 不接受“DELTA”作为数据类型。我使用“PARQUET”作为文件格式,并在我的 Delta 表上使用 VACUUM 以仅保留它的最新快照。每当我将路径设置为特定文件或 Delta 表中只有一个 snappy.parquet 文件时,数据都会正确打印。

基本上有什么方法可以创建一个从 Delta 表中获取数据的 Synapse 表/外部表吗?如果没有,有什么方法可以阻止 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

/* 使用“*”是因为使用了客户端的数据路径 */

解决方法

突触不支持Delta。 您可以在这里为该项目投票: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

同样,如果发生变化,您将需要重新生成它。

,

目前,Azure Synapse 专用 SQL 池中没有用于外部表的 DELTA 格式。您不能在可以读取增量格式的 SQL 池中创建表。即使您可以使用 PARQUET 格式解决问题并使用 Vacuum,正如您所提到的,它也不是日常数据操作的推荐解决方案。来自 Databricks 文档:

“我们不建议您将保留间隔设置为短于 7 天,因为旧快照和未提交的文件仍然可以被并发读取或写入表使用。如果真空清理活动文件,并发当真空删除尚未提交的文件时,读取器可能会失败,或者更糟糕的是,表可能会损坏。” https://docs.databricks.com/delta/delta-utility.html

回答你的第二个问题,我不知道停止创建快照的任何解决方案。 Delta Lake 的主要功能之一是提供这些快照。

我的建议是使用数据工厂或 Spark 应用程序进行数据移动、从增量表读取以及写入专用 SQL 池中的表。

  1. 使用数据工厂,您已经为 Delta 表内置了连接器,但您需要一个 Databricks 集群来连接和读取数据工厂的数据。使用复制活动或映射数据流从增量读取并写入 SQL 池。或者,从 Delta 读取,写入 Parquet 并在 SQL Pool 中创建外部表。

  2. 第二个选项是使用 Spark 应用程序。将 delta-table 中的数据读入 Spark DataFrame 并写入 SQL Pool。

Spark 应用程序的托管可以在 Azure Synapse Analytics 的 Azure Databricks 或 Spark 池中完成。 对于 Azure Databricks,有一个 Azure Synapse 连接器,更多信息请访问:https://docs.databricks.com/data/data-sources/azure/synapse-analytics.html#language-python