Azure Synapse 无服务器删除由 CREATE EXTERNAL TABLE AS SELECT 语句创建的文件
Azure Synapse serverless delete files created by a CREATE EXTERNAL TABLE AS SELECT statement
我正在使用不支持物化视图的 Synapse Serverless,但出于性能原因,某些用例需要它们。作为一种解决方法,我打算使用 CETAS 语句来保存文件并为它们安排定期更新。但是,当我尝试删除并重新创建 CETAS table 时,我收到消息:
Cannot create external table. External table location already exists. Location provided: [location]
文件由 CETAS 语句创建后,我似乎无法用另一个 CETAS 语句覆盖它们,而且我还没有找到任何其他选项来修改突触内的文件。我知道我可以创建一个更大的工作流程以在重新运行 CETAS 之前从存储中删除,但我希望有一些方法可以将内容包含在 Synapse 中。
是否有某种方法可以从 Synapse 中 delete/overwrite/modify 由 CETAS 语句创建的文件?
如您所见,删除 table 不会删除文件。这在文档中有概述(请参阅 备注 部分)...
这可能不符合您的要求,但要解决这个问题,您可以删除 table 并使用 时间戳 重新创建它。外部 table 名称保持原样,它只是包含时间戳的文件,以便与以前的创建区分开来。
下面显示了一个示例,当然,它缺少一些上下文,但您应该了解总体思路...
DECLARE @CurrentTimeStamp varchar(100) = (SELECT REPLACE(REPLACE(REPLACE(CONVERT(varchar, CURRENT_TIMESTAMP, 126), '-', ''), 'T', '_'), ':', ''))
BEGIN TRY
SET @Sql = '
IF EXISTS (SELECT * FROM sys.external_tables WHERE name = ''' + @TableName + ''' AND schema_id = ' + CAST(@SchemaIdReporting as varchar(10)) + ')
BEGIN
DROP EXTERNAL TABLE [reporting].[' + @TableName + ']
END
CREATE EXTERNAL TABLE [reporting].[' + @TableName + ']
WITH (
LOCATION = ''reporting/' + @TableName + '/' + @CurrentTimeStamp + ''',
DATA_SOURCE = [Analytics],
FILE_FORMAT = [Parquet]
) AS
' + @Sql
EXEC (@Sql)
END TRY
BEGIN CATCH
SET @ErrorSection = 'Part 1: SQL statement construction.'
SELECT @ErrorMessage = @ErrorSection + ', ' + ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()
PRINT @Sql
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
...此外,目前不支持修改 (update/insert/delete) 外部 table 中的数据,这是一种限制。可以在这里找到...
唯一的考虑是清理旧文件。我还没有这样做,但喜欢拥有所有旧数据快照的概念。我还不需要回去访问其中的任何内容,但如果我需要的话,它就在那里。
我正在使用不支持物化视图的 Synapse Serverless,但出于性能原因,某些用例需要它们。作为一种解决方法,我打算使用 CETAS 语句来保存文件并为它们安排定期更新。但是,当我尝试删除并重新创建 CETAS table 时,我收到消息:
Cannot create external table. External table location already exists. Location provided: [location]
文件由 CETAS 语句创建后,我似乎无法用另一个 CETAS 语句覆盖它们,而且我还没有找到任何其他选项来修改突触内的文件。我知道我可以创建一个更大的工作流程以在重新运行 CETAS 之前从存储中删除,但我希望有一些方法可以将内容包含在 Synapse 中。
是否有某种方法可以从 Synapse 中 delete/overwrite/modify 由 CETAS 语句创建的文件?
如您所见,删除 table 不会删除文件。这在文档中有概述(请参阅 备注 部分)...
这可能不符合您的要求,但要解决这个问题,您可以删除 table 并使用 时间戳 重新创建它。外部 table 名称保持原样,它只是包含时间戳的文件,以便与以前的创建区分开来。
下面显示了一个示例,当然,它缺少一些上下文,但您应该了解总体思路...
DECLARE @CurrentTimeStamp varchar(100) = (SELECT REPLACE(REPLACE(REPLACE(CONVERT(varchar, CURRENT_TIMESTAMP, 126), '-', ''), 'T', '_'), ':', ''))
BEGIN TRY
SET @Sql = '
IF EXISTS (SELECT * FROM sys.external_tables WHERE name = ''' + @TableName + ''' AND schema_id = ' + CAST(@SchemaIdReporting as varchar(10)) + ')
BEGIN
DROP EXTERNAL TABLE [reporting].[' + @TableName + ']
END
CREATE EXTERNAL TABLE [reporting].[' + @TableName + ']
WITH (
LOCATION = ''reporting/' + @TableName + '/' + @CurrentTimeStamp + ''',
DATA_SOURCE = [Analytics],
FILE_FORMAT = [Parquet]
) AS
' + @Sql
EXEC (@Sql)
END TRY
BEGIN CATCH
SET @ErrorSection = 'Part 1: SQL statement construction.'
SELECT @ErrorMessage = @ErrorSection + ', ' + ERROR_MESSAGE(), @ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE()
PRINT @Sql
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState)
END CATCH
...此外,目前不支持修改 (update/insert/delete) 外部 table 中的数据,这是一种限制。可以在这里找到...
唯一的考虑是清理旧文件。我还没有这样做,但喜欢拥有所有旧数据快照的概念。我还不需要回去访问其中的任何内容,但如果我需要的话,它就在那里。