2013-08-07 27 views
6

Tôi đang học cách sử dụng Hadoop Pig ngay bây giờ.Số lượng lợn Hadoop

Nếu tôi có một tập tin đầu vào như thế này:

a,b,c,true 
s,c,v,false 
a,s,b,true 
... 

Các trường cuối cùng là người tôi cần phải đếm ... Vì vậy, tôi muốn biết có bao nhiêu 'true' và 'sai' trong tập tin này .

tôi cố gắng:

records = LOAD 'test/input.csv' USING PigStorage(','); 
boolean = foreach records generate $3; 
groups = group boolean all; 

Bây giờ tôi bị mắc kẹt. Tôi muốn sử dụng:

count = foreach groups generate count('true');" 

Để có được số lượng "true" nhưng tôi luôn nhận được lỗi:

2013-08-07 16:32:36,677 [main] ERROR org.apache.pig.tools.grunt.Grunt - ERROR 1070: Could not resolve count using imports: [, org.apache.pig.builtin., org.apache.pig.impl.builtin.] Details at logfile: /etc/pig/pig_1375911119028.log

Ai có thể cho tôi biết nơi mà vấn đề là gì?

Trả lời

10

Hai thứ. Thứ nhất, count thực sự là COUNT. Trong lợn, tất cả các hàm dựng sẵn nên được gọi với tất cả các mũ.

Thứ hai, COUNT đếm số lượng giá trị trong túi chứ không tính giá trị. Vì vậy, bạn nên nhóm bởi đúng/sai, sau đó COUNT:

boolean = FOREACH records GENERATE $3 AS trueORfalse ; 
groups = GROUP boolean BY trueORfalse ; 
counts = FOREACH groups GENERATE group AS trueORfalse, COUNT(boolean) ; 

Vì vậy, bây giờ là sản phẩm của một DUMP cho counts sẽ giống như thế:

(true, 2) 
(false, 1) 

Nếu bạn muốn các tội danh đúng và sai trong quan hệ riêng của họ, sau đó bạn có thể FILTER đầu ra của counts. Tuy nhiên, nó có lẽ sẽ tốt hơn để SPLITboolean, sau đó làm hai tội danh riêng biệt:

boolean = FOREACH records GENERATE $3 AS trueORfalse ; 
SPLIT boolean INTO alltrue IF trueORfalse == 'true', 
        allfalse IF trueORfalse == 'false' ; 

tcount = FOREACH (GROUP alltrue ALL) GENERATE COUNT(alltrue) ; 
fcount = FOREACH (GROUP allfalse ALL) GENERATE COUNT(allfalse) ; 
+0

Cảm ơn, nó hoạt động! – user2597504

Các vấn đề liên quan