【问题标题】:U-SQL/ADLA: How to get multiple indexes and partitions on table?U-SQL/ADLA:如何在表上获取多个索引和分区?
【发布时间】: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


    【解决方案1】:

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

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

    目前的模式是:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-19
      • 1970-01-01
      • 2012-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多