2017-03-08 8 views
1

다음 테스트 데이터가 있습니다. 나는이 샘플 항목의 총 수를 좀하고 싶습니다돼지의 여러 필드에서 값의 수

A B C 

M O 

M M M 

M M M 

N  O 

P  N 

는 테스트 데이터 내가 동일한 작업을 수행 할 수있는 아래의 코드를

(12) 즉,하지만 난 잘못된 결과를 얻고있다.

수정하는 방법에 대한 도움이 도움이 될 것입니다.

test= LOAD 'testdata' USING PigStorage(',') as (A:chararray,B:chararray,C:chararray); 
values = FOREACH test GENERATE A==''?'null':(A is null?'null':A)) as A,(B==''?'null':(B is null?'null':B)) as B,(C==''?'null':(C is null?'null':C)) as C; 
grp = GROUP values ALL; 
counting = FOREACH grp GENERATE group, COUNT(values.A)+COUNT(values.B)+COUNT(values.C); 

이것은 12가 아니라 15로 답을줍니다.

M = 7, N = 2, O = 2, P = 1과 같은 각 값의 수를 얻고 싶습니다. 아래 코드를 작성했습니다.

test= LOAD 'testdata' USING PigStorage(',') as (A:chararray,B:chararray,C:chararray); 
values = FOREACH test GENERATE A==''?'null':(A is null?'null':A)) as A,(B==''?'null':(B is null?'null':B)) as B,(C==''?'null':(C is null?'null':C)) as C; 
grp = GROUP values ALL; 
    A = FOREACH grp { 
B =FILTER test.A=='M' OR test.B=='M' OR test.C=='M'; 
GENERATE group, COUNT(B); 
}; 

"출력에 스칼라에 둘 이상의 행이 있습니다."라는 오류가 나타납니다.

답변

2

최종 집계에서 열 이름도 계산 중입니다. 첫 번째 행을 무시하도록 스크립트를 수정 한 다음 by 및 count.

test= LOAD 'testdata' USING PigStorage(',') as (A:chararray,B:chararray,C:chararray); 

ranked = rank test; 
test1 = Filter ranked by ($0 > 1); --Note:rank_test should work. 

values = FOREACH test1 GENERATE A==''?'null':(A is null?'null':A)) as A,(B==''?'null':(B is null?'null':B)) as B,(C==''?'null':(C is null?'null':C)) as C; 
grp = GROUP values ALL; 
counting = FOREACH grp GENERATE group, COUNT(values.A)+COUNT(values.B)+COUNT(values.C); 
+0

여기에 rank_test 란 무엇입니까? –

+0

대답은 기본적으로 빈 필드를 무시하여 데이터 세트에있는 필드 수를 제공해야하는데, 이는 12입니다. –

+0

rank는 relation.rank_test의 레코드에 대한 행 번호를 지정합니다. 이는 행 번호가있는 새 열입니다. 이렇게하면 열 머리글을 제거하여 rank_test> 1을 사용하여 첫 번째 행 A, B, C를 제거 할 수 있습니다. 스크립트는 당신이 얻은 것을 봅니다. 그것은 12를 주어야합니다. –