在 Azure Synapse 专用/无服务器 SQL 池中使用增量表
Posted
技术标签:
【中文标题】在 Azure Synapse 专用/无服务器 SQL 池中使用增量表【英文标题】:Using Delta Tables in Azure Synapse Dedicated/Serverless SQL Pools 【发布时间】:2021-05-28 20:54:42 【问题描述】:我目前是一名初级数据开发人员,最近看到一篇帖子说 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
/* '*' used 因为使用了客户端的数据路径 */
【问题讨论】:
【参考方案1】:Synapse 不支持 Delta。 你可以在这里投票:https://feedback.azure.com/forums/307516-azure-synapse-analytics/suggestions/41120794-delta-lake-support-to-sql-on-demand
我的 serverless pool 有一些解决方法:
您可以使用此 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
如果发生变化,您将需要重新生成它。
【讨论】:
【参考方案2】:在无服务器 Synapse SQL 池中查询 Delta Lake 格式目前处于公共预览阶段。
注意:此预览版未提供服务级别协议,不建议用于生产工作负载。某些功能可能不受支持或功能受限。
此功能为公共预览版,存在一些已知问题和限制。查看Synapse serverless SQL pool self-help page 上的已知问题。
更多详情,请参考Query Delta Lake files (preview) using serverless SQL pool in Azure Synapse Analytics。
【讨论】:
【参考方案3】:目前,Azure Synapse 专用 SQL 池中没有用于外部表的 DELTA 格式。您不能在可以读取 Delta 格式的 SQL 池中创建表。即使您可以使用 PARQUET 格式解决您的问题并使用 Vacuum,正如您所提到的,它不是日常数据操作的推荐解决方案。来自 Databricks 文档:
“我们不建议您将保留间隔设置为短于 7 天,因为旧快照和未提交的文件仍可能被并发读取器或写入器使用表。如果清理活动文件,并发读取器可能会失败,或者更糟糕的是,当真空删除尚未提交的文件时,表可能会损坏。” https://docs.databricks.com/delta/delta-utility.html
为了回答您的第二个问题,我不知道有任何解决方案可以停止创建快照。 Delta Lake 的主要功能之一是提供这些快照。
我的建议是使用数据工厂或 Spark 应用程序进行数据移动,从 Delta 表中读取数据并写入专用 SQL 池中的表。
使用数据工厂,您已经为 Delta 表构建了连接器,但您需要一个 Databricks 集群来使用数据工厂连接和读取数据。使用 Copy Activity 或 Mapping Data Flow 从 Delta 读取并写入 SQL 池。或者,从 Delta 读取,写入 Parquet 并在 SQL 池中创建外部表。
第二种选择是使用 Spark 应用程序。将 delta-table 中的数据读取到 Spark DataFrame 中并将其写入 SQL 池。
可以在 Azure Databricks 或用于 Azure Synapse Analytics 的 Spark-pools 中托管 Spark 应用程序。 对于 Azure Databricks,有一个 Azure Synapse 连接器,更多信息在这里:https://docs.databricks.com/data/data-sources/azure/synapse-analytics.html#language-python
【讨论】:
以上是关于在 Azure Synapse 专用/无服务器 SQL 池中使用增量表的主要内容,如果未能解决你的问题,请参考以下文章
Azure Synapse 专用 sql 池未在 Synapse Studio 中显示数据对象
Azure Synapse 无服务器 - Azure Synapse 无服务器池中的流加载镶木地板意外结束
Azure Synapse Analytics 专用 SQL 池 - IIF 语句不起作用
文档中显示的 sql 代码未在 azure synapse 专用 sql 池上运行