Grundzählung erfolgt wie in anderen Antworten, und in der Schweine Dokumentation wurde festgestellt:
logs = LOAD 'log';
all_logs_in_a_bag = GROUP logs ALL;
log_count = FOREACH all_logs_in_a_bag GENERATE COUNT(logs);
dump log_count
Sie haben Recht, dass das Zählen ineffizient ist, auch wenn Schweine gebautet COUNT verwenden, da dies wird u se ein Reduzierstück. Wie auch immer, ich hatte heute eine Enthüllung, dass einer der Wege, es zu beschleunigen, darin bestehen würde, die RAM-Nutzung der Beziehung, die wir zählen, zu reduzieren.
Mit anderen Worten, wenn wir eine Beziehung zählen, kümmern wir uns nicht wirklich um die Daten selbst, also verwenden wir so wenig RAM wie möglich. Sie waren mit Ihrer ersten Iteration des Count-Skripts auf dem richtigen Weg.
logs = LOAD 'log'
ones = FOREACH logs GENERATE 1 AS one:int;
counter_group = GROUP ones ALL;
log_count = FOREACH counter_group GENERATE COUNT(ones);
dump log_count
Dies funktioniert auf viel größere Beziehungen als das vorherige Skript und sollte viel schneller sein. Der Hauptunterschied zwischen diesem und Ihrem ursprünglichen Skript besteht darin, dass wir nichts zusammenfassen müssen.
Ist es möglich, die Anzahl der Zeilen in einem Alias ohne erste Gruppierung zu zählen? – zzz
Gleiche Frage. Ich habe gelesen, dass 'GROUP x ALL 'eine Serialisierung in der Pipeline erzwingt, was zu einer möglichen Verlangsamung führen kann. Ist das korrekt? –
Sie müssen vor dem Zählen gruppieren. Laut http://pig.apache.org/docs/r0.15.0/func.html#count: "COUNT benötigt eine vorangehende GROUP ALL-Anweisung für globale Zählungen und eine GROUP BY-Anweisung für Gruppenzählungen." –