2016-11-17 3 views
1

Also habe ich Hunderte von Gruppen generiert und versuche zu vermeiden, dass ich sie durchforsten muss und schaue nur auf die mit den meisten Ergebnissen. Dafür zähle ich sie, bestelle sie und beschränke mich dann auf die Top 5 Ergebnisse.Zähle für 'Andere' außerhalb der Top 5 Ergebnisse mit Pig

counts = foreach (group distinctVals by (description)) generate group, COUNT_STAR(distinctVals) as count; 
ordered = order counts by count desc; 
limited = limit ordered 5; 
dump limited; 

Allerdings Ich mag würde eine separate Zählung haben, wie viele Ergebnisse haben die „Top 5“ nicht machen und ist sich als Gruppe genannt einfach andere.

So würde meine Ausgabe etwas wie

(John ,38436) 
(Steve ,13654) 
(Sarah ,9334) 
(Rick ,3241) 
(Morty ,784) 
(Other ,3421) 

Antwort

0

Verwendung RANK sein. Nachdem Sie die Daten bestellt haben, verwenden Sie , um einen Rang für die geordnete Beziehung zu generieren. Dadurch wird eine neue Spalte rank_ordered als erste Spalte hinzugefügt. Sie können dann die Spalte rank zu FILTER den Datensatz in zwei Relationen verwenden, sagen Sie limited, other.Once Sie haben andere Beziehung, GROUP ALL und SUM die dritte Spalte dh $ 2 oder Count-Spalte. Schließlich UNION begrenzt und die andere_sum.

counts = foreach (group distinctVals by (description)) generate group, COUNT_STAR(distinctVals) as count; 
ordered = order counts by count desc; 
ordered1 = rank ordered; 

limited = FILTER ordered1 BY rank_ordered <= 5; 
other = FILTER ordered1 BY rank_ordered > 5; 

other_grp = GROUP other ALL; 
other_sum = FOREACH other_grp GENERATE SUM(other.$2); 

final = UNION limited,other_sum; 
+0

Danke! Ich werde es versuchen. – Pxl