繁体   English   中英

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

[英]Using Delta Tables in Azure Synapse Dedicated/Serverless SQL Pools

我目前是一名初级数据开发人员,最近看到一篇帖子说 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

/* 使用 '*' 因为使用了客户端的数据路径 */

在无服务器 Synapse SQL 池中查询 Delta Lake 格式目前处于公共预览阶段。

注意:此预览版在没有服务级别协议的情况下提供,不建议用于生产工作负载。 某些功能可能不受支持或功能受限。

此功能为公共预览版,存在一些已知问题和限制。 查看Synapse 无服务器 SQL 池自助页面上的已知问题。

有关更多详细信息,请参阅在 Azure Synapse Analytics 中使用无服务器 SQL 池查询 Delta Lake 文件(预览版)

Synapse 不支持 Delta。 你可以在这里投票: https://feedback.azure.com/forums/307516-azure-synapse-analytics/suggestions/41120794-delta-lake-support-to-sql-on

我在无服务器池中有一些解决方法:

您可以使用此 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 Dedicated SQL Pool 中没有用于外部表的 DELTA 格式。 您不能在可以读取 Delta 格式的 SQL 池中创建表。 尽管您可以使用 PARQUET 格式解决您的问题并使用 Vacuum,但正如您所提到的,对于日常数据操作来说,它不是推荐的解决方案。 从 Databricks 文档中:

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

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

我的建议是使用数据工厂或 Spark 应用程序进行数据移动,从 Delta 表读取并写入专用 SQL 池中的表。

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

  2. 第二种选择是使用 Spark 应用程序。 从增量表读取数据到 Spark DataFrame 并将其写入 SQL 池。

Spark 应用程序的托管可以在 Azure Databricks 或用于 Azure Synapse Analytics 的 Spark 池中完成。 对于 Azure Databricks 有一个 Azure Synapse 连接器,更多信息在这里: https://docs.htmldata-synapse/#language-analytic/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM