在Azure Data Lake Analytics(ADLA)中,您只能在表上定义一个索引,并且必须对其进行群集。你有两种分析需要在不同的密钥上进行分区才能有效,你必须复制表创建脚本等以使事情并行运行。
E.g。简单的订单示例
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 :(脚本是示例。未经测试!)
是否有人就合适的工作流程/模式提出建议以克服此限制
答案 0 :(得分:2)
首先,CLUSTERED INDEX(与大多数数据库中一样)意味着它代表数据的主要表示形式。因此,为同一个表设置两个聚簇索引本身不起作用(或者与定义两个表没有太大区别)。
我们的待办事项上有一个工作项,用于添加有助于您的方案的辅助(非群集)索引。请将您的投票添加到https://feedback.azure.com/forums/327234-data-lake/suggestions/10622475-multiple-indexes-on-adl-a-table。
现在的模式是:
尝试找到适用于尽可能多的昂贵查询的分发和群集。
如果您找不到一个,请定义多个表,然后提供视图或表值函数作为抽象,以帮助您的用户选择正确的。