强制 CETAS 只写一个文件?

Force CETAS to only write one file?

如果我 运行 创建外部 TABLE AS SELECT * FROM DistributedTable,那么我最终会在 blob 存储中得到 60 个文件。如果我执行 CREATE EXTERNAL TABLE AS SELECT * from sys.objects,我会在 blob 存储中得到一个文件。果然不出所料。

如何从分布式 table 中获取第一个 CETAS 以仅写入一个文件?一旦 Azure SQL DW 支持复制的 table,来自复制的 table 的 CETAS 是否保证只创建一个文件?

场景是希望每天将一个文件导出到 blob 存储。显然,消费应用程序只需要一个文件,并且行数足够小,如果它确实导出到 60 个文件,大多数将是空白的。

sys.objects table 存储在 SQL 数据仓库的控制节点上(而不是分布在计算节点上)。因此,此 table 上的 CETAS 由 1 个编写器线程执行,该线程在 blob 存储中创建 1 个文件。分布式 table 中的数据在 60 个分布中进行分片,因此 SQL DW 中分布式 table 上的 CETAS 将始终创建 60 个文件,每个分布并行写入 1 个文件。

强制为分布式 table 写入单个文件的一种变通方法是在语句的 SELECT 部分使用 TOP 子句。

SELECT count(*) FROM dbo.Finance --N rows

CREATE EXTERNAL TABLE dbo.FinanceExternal
WITH (  LOCATION = '/finance/', DATA_SOURCE = AzureStorage, FILE_FORMAT = TextFile)
AS SELECT TOP N * FROM dbo.FinanceNew;

由于 TOP 表达式是在控制节点上计算的,因此您分发的行 table 将移至控制节点。随后,1 个编写器线程会将结果集写入 blob 存储中的单个文件。

是的,将来 SQL DW 支持复制 table 时,复制 table 的 CETAS 将只创建一个文件。

萨哈吉

了解SQLDW架构和control/compute个节点的作用,参考:https://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-overview-what-is/