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
Vous devez vous connecter pour publier un commentaire.
Sinon, vous pourriez avoir un coup d'oeil à cette Ruche billet qui contient plusieurs extensions de fonctionnalités.
Entre autres, il y a un somme cumulative de mise en œuvre (GenericUDFSum).
Cette fonction (appelée "rsum") prend deux arguments, le hachage de l'id (par lequel les enregistrements sont partitionnī les réducteurs) et leurs valeurs correspondantes pour résumer:
OriginalL'auteur Lorand Bendig
Ruche fournit une meilleure façon de le faire en une seule ligne -
Veuillez suivre les étapes ci-dessous pour atteindre votre objectif de rendement
créer un tableau de la ruche qui peut contenir votre jeu de données -
Maintenant il suffit d'exécuter commande ci-dessous dans votre ruche terminal -
La sortie sera comme -
J'espère que cela peut vous aider à obtenir votre objectif de rendement.
OriginalL'auteur Bector