簡體   English   中英

U-SQL / ADLA:如何在表上獲取多個索引和分區?

[英]U-SQL/ADLA: How to get multiple indexes and partitions on table?

在Azure數據湖分析(ADLA)中,您只能在一個表上定義一個索引,並且該索引必須是群集的。 它有兩種需要在不同鍵上進行分區才能有效的分析,您必須復制表創建腳本等以使事物並行運行。

例如簡單的Order示例

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進行分區/數據透視時,這可以很好地工作。 但是,如果您有一個基於客戶ID或客戶ID范圍的查詢,該怎么辦?

我目前要做的是做這樣的事情

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)

);

並針對許多其他情況重復上述操作(例如,針對包含dayofyear的計算列)

現在,實際分析腳本的開發人員需要使用適合他們任務的分區方案來選擇表,並在我們決定需要其他分區方案時返回並使用新表名更新其代碼。

我想讓優化器很容易利用的東西就是允許表/索引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 :(腳本是示例。未經測試!)

是否有人對合適的工作流程/模式有建議以克服此限制

首先,聚集索引(與大多數數據庫一樣)意味着它表示數據的主要表示形式。 因此,為同一張表擁有兩個聚簇索引本身將無法正常工作(或者與您定義兩個表沒有太大區別)。

我們的積壓工作中確實有一個工作項,用於添加輔助(非聚集)索引,這將有助於解決您的情況。 請向https://feedback.azure.com/forums/327234-data-lake/suggestions/10622475-multiple-indexes-on-adl-a-table添加投票。

目前的模式是:

  1. 嘗試找到可用於盡可能多的昂貴查詢的發行版和集群。

  2. 如果找不到一個,則定義多個表,然后提供視圖或表值函數作為抽象,以幫助用戶選擇正確的表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM