2017-06-20 8 views
0

Azure Data Lake Analytics(ADLA)では、テーブルに1つのインデックスしか定義できず、クラスタ化する必要があります。効率の良いためには、異なるキーでのパーティション分割が必要な2種類の分析があります。テーブル作成スクリプトなどを複製して、並列実行する必要があります。U-SQL/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) 

); 

のようなものを行う、今

(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) 
); 

のような複数のインデックスが含まれている、我々は持っていません。 2組のテーブルDDLを維持し、U-SQL開発者はdbo.Ordersとdbo.Orders_ByCustomerIdの間でコードを更新する必要はありません。

例: 今、私たちは、これが

@res = REDUCE dbo.Orders ON CustomerId 
    PRODUCE CustomerId, CustomerClass int 
    READONLY CustomerId 
    USING new Extension.R.Reducer(scriptFile:"CustomerClassifcation.R", rReturnType:"dataframe"); 

PS並列に実行されることはありませんが、これは

@res = REDUCE dbo.Orders_ByCustomerId ON CustomerId 
    PRODUCE CustomerId, CustomerClass int 
    READONLY CustomerId 
    USING new Extension.R.Reducer(scriptFile:"CustomerClassifcation.R",rReturnType:"dataframe"); 

平行になるよう、さまざまな表情を行う必要があります。(スクリプトの例わけではありませんテスト済み!)

誰もこの制限を克服するための適切なワークフロー/パターンに関する提案を持っていますか

答えて

2

最初に、CLUSTERED INDEX(ほとんどのデータベースのように)は、それがデータの主な表現を表すことを意味します。したがって、同じテーブルに対して2つのクラスタ化インデックスを持つことは、それ自体は機能しません(または、2つのテーブルを定義することと大きく異なることはありません)。

シナリオに役立つ副インデックス(非クラスタ化インデックス)を追加するために、バックログに作業項目があります。あなたの投票をhttps://feedback.azure.com/forums/327234-data-lake/suggestions/10622475-multiple-indexes-on-adl-a-tableに追加してください。

今のパターンは以下のとおりです。

  1. は、可能な限りあなたの高価なクエリの多くのために働く分布およびクラスタを検索してみてください。

  2. 見つからない場合は、複数のテーブルを定義し、ユーザーが適切なテーブルを選択するのに役立つ抽象としてビューまたはテーブル値関数を提供します。

関連する問題