强制CETAS只写一个文件?

时间:2016-01-14 22:03:25

标签: azure-sqldw

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

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

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

1 个答案:

答案 0 :(得分: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将只创建一个文件。

Sahaj

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