2017-06-20 3 views
0

Dans Azure Data Lake Analytics (ADLA), vous ne pouvez définir qu'un seul index sur une table et il doit être mis en cluster. Si vous avez deux types d'analyse qui nécessitent un partitionnement sur des clés différentes pour être efficace, vous devez dupliquer les scripts de création de tables, etc. pour que les choses soient parallèles.U-SQL/ADLA: Comment obtenir plusieurs index et partitions sur la table?

E.g. L'exemple de commande simple

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

Cela fonctionne correctement lorsque vos requêtes partitionne/pivote autour de OrderId. Mais que se passe-t-il si vous avez une requête basée sur CustomerID ou sur des plages de CustomerID?

Ce que je fais est actuellement à faire des trucs comme ça

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) 

); 

Et répéter pour beaucoup d'autres scénarios (comme par une colonne calculée qui contient le dayofyear)

Maintenant, les développeurs des scripts d'analyse réels besoin de choisir la table avec le schéma de partitionnement qui correspond à leur tâche, et revenir en arrière et mettre à jour leur code avec le nouveau nom de la table lorsque nous décidons que nous avons besoin de scénarios de partitionnement supplémentaires.

Ce que je voudrais, et il semble que somethings qu'un optimiseur pourrait utiliser très facilement, est de permettre à la table/index DML contient plusieurs index comme celui-ci

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

De cette façon, nous n'avons pas pour maintenir deux ensembles de DDL de table et les développeurs U-SQL n'ont pas à mettre à jour leur code entre dbo.Orders et dbo.Orders_ByCustomerId.

Exemple: Maintenant, nous devons faire des expressions différentes, comme ce sera parallèle

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

Bien que ce ne sera pas exécuté parallèle

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

PS: (Les scripts sont des exemples non. testé!)

Est-ce que quelqu'un a des suggestions sur le flux de travail approprié/modèle pour surmonter cette limitation

Répondre

2

D'abord, un INDEX GRAPPE (comme dans la plupart des bases de données) signifie qu'il représente la représentation primaire des données. Donc, avoir deux indices groupés pour la même table ne fonctionnerait pas en soi (ou ne serait pas très différent de vous en définissant deux tables).

Nous avons un élément de travail dans notre carnet de commandes pour ajouter des indices secondaires (non groupés) qui pourraient vous aider dans votre scénario. Veuillez ajouter votre vote à https://feedback.azure.com/forums/327234-data-lake/suggestions/10622475-multiple-indexes-on-adl-a-table.

Pour l'instant les motifs sont les suivants:

  1. Essayez de trouver une distribution et cluster qui fonctionne pour le plus grand nombre de vos requêtes coûteuses que possible. Si vous ne pouvez pas en trouver un, définissez plusieurs tables, puis fournissez des vues ou des fonctions de table sous forme d'abstractions qui aident vos utilisateurs à choisir la bonne.