U-SQL / ADLA:如何在表上获取多个索引和分区?

时间:2017-06-20 09:30:28

标签: azure azure-data-lake u-sql

在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 :(脚本是示例。未经测试!)

是否有人就合适的工作流程/模式提出建议以克服此限制

1 个答案:

答案 0 :(得分:2)

首先,CLUSTERED INDEX(与大多数数据库中一样)意味着它代表数据的主要表示形式。因此,为同一个表设置两个聚簇索引本身不起作用(或者与定义两个表没有太大区别)。

我们的待办事项上有一个工作项,用于添加有助于您的方案的辅助(非群集)索引。请将您的投票添加到https://feedback.azure.com/forums/327234-data-lake/suggestions/10622475-multiple-indexes-on-adl-a-table

现在的模式是:

  1. 尝试找到适用于尽可能多的昂贵查询的分发和群集。

  2. 如果您找不到一个,请定义多个表,然后提供视图或表值函数作为抽象,以帮助您的用户选择正确的。