【发布时间】:2017-06-21 00:42:38
【问题描述】:
在 Azure 数据湖分析 (ADLA) 中,您只能在表上定义一个索引,并且它必须是集群的。如果您有两种分析需要对不同的键进行分区以提高效率,您必须复制表创建脚本等以使事情并行运行。
例如简单的订单示例
CREATE TABLE dbo.Orders
(
OrderID int,
CustomerID int,
OrderDetailID int,
OrderTotal double,
OrderDate DateTime,
INDEX clx_OrderID_CustomerID CLUSTERED(OrderID, CustomerID ASC) DISTRIBUTED BY HASH(OrderId)
);
当您的查询围绕 OrderId 进行分区/枢轴时,这可以正常工作。但是,如果您有一个基于 CustomerID 或 CustomerID 范围的查询呢?
我目前所做的就是做这样的事情
CREATE TABLE dbo.Orders_ByCustomerId
(
OrderID int,
CustomerID int,
OrderDetailID int,
OrderTotal double,
OrderDate DateTime,
INDEX clx_CustomerId CLUSTERED(OrderID, CustomerID ASC) DISTRIBUTED BY HASH(CustomerId)
);
并在许多其他情况下重复(例如每个包含年份的计算列)
现在实际分析脚本的开发人员需要选择具有适合其任务的分区方案的表,并在我们决定需要其他分区方案时返回并使用新表名称更新他们的代码。
我想要的,似乎优化器可以很容易利用的东西,是允许表/索引 DML 包含多个这样的索引
CREATE TABLE dbo.Orders
(
OrderID int,
CustomerID int,
OrderDetailID int,
OrderTotal double,
OrderDate DateTime,
INDEX clx_OrderID_CustomerID CLUSTERED(OrderID, CustomerID ASC) DISTRIBUTED BY HASH(OrderId),
INDEX clx_CustomerID_OrderID CLUSTERED(CustomerID, OrderID ASC) DISTRIBUTED BY HASH(CustomerID)
);
这样,我们不必维护两组表 DDL,并且 U-SQL 开发人员不必在 dbo.Orders 和 dbo.Orders_ByCustomerId 之间更新他们的代码。
示例: 现在我们需要制作不同的表达式,因为这将是并行的
@res = REDUCE dbo.Orders_ByCustomerId ON CustomerId
PRODUCE CustomerId, CustomerClass int
READONLY CustomerId
USING new Extension.R.Reducer(scriptFile:"CustomerClassifcation.R",rReturnType:"dataframe");
虽然这不会并行运行
@res = REDUCE dbo.Orders ON CustomerId
PRODUCE CustomerId, CustomerClass int
READONLY CustomerId
USING new Extension.R.Reducer(scriptFile:"CustomerClassifcation.R", rReturnType:"dataframe");
PS:(脚本是示例。未经测试!)
有没有人对合适的工作流程/模式提出建议来克服这个限制
【问题讨论】:
标签: azure azure-data-lake u-sql