Calcul de somme en cours d'exécution à l'aide de la ruche des fonctions udf

Je suis un débutant dans la Ruche et voudrais pardon pour mon ignorance à l'avance pour n'importe quel fourre-dessous. J'ai un tableau comme suit:

SELECT a.storeid, a.smonth, a.sales FROM table a;
1001    1       35000.0
1002    2       35000.0
1001    2       25000.0
1002    3       110000.0
1001    3       40000.0
1002    1       40000.0

Mon objectif de sortie est comme suit:

1001    1       35000.0 35000.0
1001    2       25000.0 60000.0
1001    3       40000.0 100000.0
1002    1       40000.0 40000.0
1002    2       35000.0 75000.0
1002    3       110000.0 185000.0

J'ai écrit un simple ruche udf de la somme de classe à atteindre le dessus et utilisé TRIER PAR storeid, smonth dans la requête:

SELECT a.storeid, a.smonth, a.sales, rsum(sales)
FROM (SELECT * FROM table SORT BY storeid, smonth) a;

Évidemment, il ne produit pas au-dessus de la sortie puisqu'il n'est qu'un mappeur et le même udf instance est appelé qui génère une somme en cours d'exécution sur l'ensemble total. Mon objectif est de rétablir le cumul variable d'instance dans l'udf classe pour chaque storeid, de sorte que la fonction d'évaluation des rendements au-dessus de la sortie.
J'ai utilisé les suivants:
1. Passer le storeid variable rsum(chiffre d'affaires, storeid) et puis on peut gérer la situation correctement dans l'udf classe.
2. À l'aide de 2 mappeurs comme dans la requête suivante:

set mapred.reduce.tasks=2;
SELECT a.storeid, a.smonth, a.sales, rsum(sales)
FROM (SELECT * FROM table DISTRIBUTE BY storeid SORT BY storeid, smonth) a;

1002    1       40000.0 40000.0
1002    2       35000.0 75000.0
1002    3       110000.0 185000.0
1001    1       35000.0 35000.0
1001    2       25000.0 60000.0
1001    3       40000.0 100000.0

Pourquoi l'1002 apparaît en haut toujours?
J'aimerais solliciter vos suggestions sur les autres différentes méthodes dans lesquelles je peux atteindre le même (tels que les sous-requêtes/jointures) en dehors des méthodes ci-dessus. Aussi, ce sera le temps des complexités de vos méthodes?

OriginalL'auteur Code Warrior | 2013-01-28