Основной подсчет производится, как указано в других ответах и в документации на свиней:
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
Вы правы в том, что подсчет неэффективен даже при использовании встроенного в СЧЕТ свиньи, потому что при этом будет использоваться один редуктор. Однако сегодня у меня появилось откровение, что одним из способов ускорить его было бы сокращение использования ОЗУ для отношения, которое мы рассчитываем.
Другими словами, при подсчете отношения мы на самом деле не заботимся о самих данных, поэтому давайте использовать как можно меньше оперативной памяти. Вы были на правильном пути с первой итерацией сценария подсчета.
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
Это будет работать с гораздо большими отношениями, чем предыдущий скрипт, и должно быть намного быстрее. Основное различие между этим и вашим оригинальным сценарием в том, что нам не нужно ничего суммировать.