Azure synapse 中的外部表 - 删除 parquet 文件时出错

External table in Azure synapse - Error as parquet file is removed

提问人:Samuel Appleton 提问时间:10/24/2023 更新时间:10/25/2023 访问量:67

问:

我正在通过 databricks 将 parquet 文件写入 azure Data Lake Storage 系统。 我正在使用以下命令来编写 parquet 文件:

cultural_split.write.partitionBy("filename").mode('overwrite').parquet("/mnt/crime/transformed-data")

然后,我将使用 parquet 文件创建一个外部表,并且可以在 synapse 中使用 SQL 查询该表。大约 30 分钟后,我在尝试查询表时收到此错误:

外部表“dbo.cultural_data”不可访问,因为位置不存在或被另一个进程使用。

然后,我检查了我的数据湖,可以看到 parquet 文件不再存在。如果我选中“显示”已删除的对象,我仍然看不到该文件。

创建外部表时是否缺少某些内容?我已关闭此 blob 存储的软删除,我想不出任何其他可能正在删除此文件的进程。

下面是我用于创建外部表的代码:

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 = 'crime-data_crimedatasam_dfs_core_windows_net') 
    CREATE EXTERNAL DATA SOURCE [crime-data_crimedatasam_dfs_core_windows_net] 
    WITH (
        LOCATION = 'abfss://[email protected]' 
    )
GO

CREATE EXTERNAL TABLE dbo.crime_data (
    [ethnicity] nvarchar(80),
    [police_district] nvarchar(80),
    [lower_age] int,
    [upper_age] int
    )
    WITH (
    LOCATION = 'transformed-data/filename=crime_data/part-00000-tid-3588581976832316109-20e2477d-82c0-47d9-ba75-cf341910855e-20-1.c000.snappy.parquet',
    DATA_SOURCE = [crime-data_sam_dfs_core_windows_net],
    FILE_FORMAT = [SynapseParquetFormat]
    )
GO


SELECT TOP 100 * FROM dbo.crime_data
GO

非常感谢,

山 姆

azure-blob-storage azure-databricks azure-data-lake 外部表

评论

0赞 Chen Hirsh 10/24/2023
可能有一些过程会删除该文件。尝试在另一个位置创建它,并检查它是否在 30 分钟后仍然消失。

答:

0赞 DileeprajnarayanThumula 10/25/2023 #1
  • 确保当前没有其他程序或任务正在使用或 更改要保存 Parquet 文件的区域中的信息。
  • 在某些情况下,你可能决定不在 blob 上设置生存时间 (TTL)。如果执行此操作,Azure CDN 将自动强制实施 7 天的默认 TTL,除非已在 Azure 门户中配置缓存规则。请务必注意,此默认 TTL 仅适用于常规 Web 交付优化。

详细了解如何在 Azure CDN 中管理 Azure Blob 存储的过期

  • 创建外部表时,可以选择更广泛的路径定义,而不是指定确切的文件。此方法可确保外部表能够更好地适应文件或分区中的任何更改,从而使其更具弹性。

我尝试了以下指向 partion 文件夹并创建外部表的方法:

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 = 'folder02_dileepsynpadls_dfs_core_windows_net') 
    CREATE EXTERNAL DATA SOURCE [folder02_dileepsynpadls_dfs_core_windows_net] 
    WITH (
        LOCATION = 'abfss://<CONTAINER>@<STORAGE ACCOUNT>.dfs.core.windows.net' 
    )
GO
CREATE EXTERNAL TABLE dbo.file_name_ext_table (
    [age] bigint
    )
    WITH (

    LOCATION = 'transformed-data/**',
    DATA_SOURCE = [folder02_dileepsynpadls_dfs_core_windows_net],
    FILE_FORMAT = [SynapseParquetFormat]
    )
GO
SELECT TOP 100 * FROM dbo.file_name_ext_table
GO

enter image description here