2017-05-13 1 views
0

Je voudrais agréger une colonne sur plusieurs dimensions différentes. Je pense que GOUPING SETS serait approprié à mon problème, mais je ne peux pas comprendre comment transformer/remodeler la table résultante de GROUPING SETS.Comment modifier les données après GROUPING SETS dans Hive?

Ceci est ma requête GROUPING SETS:

select date, dim1, dim2, dim3, sum(value) as sum_value 
from table 
grouping by date, dim1, dim2, dim3 
grouping sets ((date, dim1), (date, dim2), (date, dim3)) 

La requête se traduirait par une table comme ceci:

date, dim1, dim2, dim3, sum_value 
2017-01-01, A, NULL, NULL, [value_A] 
2017-01-01, B, NULL, NULL, [value_B] 
2017-01-01, NULL, C, NULL, [value_C] 
2017-01-01, NULL, D, NULL, [value_D] 
2017-01-01, NULL, NULL, E, [value_E] 
2017-01-01, NULL, NULL, F, [value_F] 

Mais ce que je vraiment besoin est une table comme ceci:

date, dim, factor, sum_value 
2017-01-01, dim1, A, [value_A] 
2017-01-01, dim1, B, [value_B] 
2017-01-01, dim2, C, [value_C] 
2017-01-01, dim2, D, [value_D] 
2017-01-01, dim3, E, [value_E] 
2017-01-01, dim3, F, [value_F] 

Le nombre réel de dimensions est bien supérieur à 3, donc ce ne serait pas une bonne idée de e requête Existe-t-il un moyen de remodeler la table à partir d'ensembles de regroupement ou d'autres méthodes d'agrégation pour obtenir la table souhaitée?

Merci!

+0

S'il vous plaît ajouter un échantillon de données complète, y compris les résultats requis –

Répondre

0
select `date` 
     ,elt(log2(GROUPING__ID - 1),'dim1','dim2','dim3')  as dim 
     ,coalesce (dim1,dim2,dim3)        as factor 
     ,sum(value)           as sum_value 

from  `table` 

group by `date`,dim1,dim2,dim3 
      grouping sets ((`date`,dim1),(`date`,dim2),(`date`,dim3)) 
+0

Check mise à jour réponse –

+0

Merci à! C'est exactement ce dont j'ai besoin! –