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