【问题标题】:Using Delta Tables in Azure Synapse Dedicated/Serverless SQL Pools在 Azure Synapse 专用/无服务器 SQL 池中使用增量表
【发布时间】: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 因为使用了客户端的数据路径 */

【问题讨论】:

    标签: sql azure pyspark azure-synapse delta-lake


    【解决方案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 池中的表。

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

        2. 第二种选择是使用 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

        【讨论】:

          猜你喜欢
          • 2021-06-06
          • 2021-09-05
          • 2022-10-04
          • 2021-12-25
          • 2021-12-20
          • 1970-01-01
          • 2022-01-23
          • 2021-10-19
          • 2021-10-31
          相关资源
          最近更新 更多