2

如果我运行 CREATE EXTERNAL TABLE AS SELECT * FROM DistributedTable,那么我最终会在 blob 存储中得到 60 个文件。如果我从 sys.objects CREATE EXTERNAL TABLE AS SELECT *,我会在 blob 存储中获得一个文件。这是我所期望的。

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

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

4

1 回答 1

3

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

强制为分布式表写入单个文件的一种解决方法是在语句的 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 表达式是在控制节点上计算的,因此分布式表的行将被移动到控制节点。随后,1 个写入器线程会将结果集写入 blob 存储中的单个文件。

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

萨哈伊

要了解 SQL DW 架构和控制/计算节点的作用,请参阅:https ://azure.microsoft.com/en-us/documentation/articles/sql-data-warehouse-overview-what-is/

于 2016-01-15T00:47:53.240 回答