đếm cơ bản được thực hiện như được ghi trong câu trả lời khác, và trong tài liệu lợn:
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
Bạn có quyền đếm đó là không hiệu quả, thậm chí khi sử dụng COUNT địa chỉ BUILTIN lợn vì điều này sẽ u se một bộ giảm tốc. Tuy nhiên, tôi đã có một sự mặc khải ngày hôm nay rằng một trong những cách để tăng tốc nó sẽ là giảm việc sử dụng RAM của mối quan hệ chúng ta đang đếm.
Nói cách khác, khi đếm một mối quan hệ, chúng tôi không thực sự quan tâm đến dữ liệu, vì vậy hãy sử dụng ít RAM nhất có thể. Bạn đã đi đúng hướng với lần lặp đầu tiên của tập lệnh đếm.
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
Điều này sẽ làm việc trên các mối quan hệ lớn hơn nhiều so với tập lệnh trước và sẽ nhanh hơn nhiều. Sự khác biệt chính giữa điều này và kịch bản gốc của bạn là chúng ta không cần phải tổng hợp bất cứ điều gì.
Có thể đếm số lượng hàng trong một bí danh mà không nhóm đầu tiên? – zzz
Cùng một câu hỏi. Tôi đọc rằng 'GROUP x ALL' sẽ buộc một serialization trong đường ống với hậu quả có thể làm chậm. Đúng không? –
Bạn phải nhóm trước khi đếm. Theo http://pig.apache.org/docs/r0.15.0/func.html#count: "COUNT yêu cầu câu lệnh GROUP ALL trước cho số lượng toàn cầu và câu lệnh GROUP BY cho số lượng nhóm". –