2017-12-19 23 views
0

나는 사용자 등급별 영화 목록을 가지고 있습니다.중첩 된 Json을 사용하는 Hadoop PIG

{"_id":59607,"title":"King Corn (2007)", 
    "genres":["Documentary"], 
    "ratings":[ {"userId":1860,"rating":3}, 
       {"userId":9970,"rating":3.5}, 
       {"userId":16929,"rating":1.5}, 
       {"userId":23473,"rating":4}, 
       {"userId":23733,"rating":4}, 
       {"userId":27584,"rating":3}, 
       {"userId":28232,"rating":4}, 
       {"userId":29482,"rating":3}, 
       {"userId":40976,"rating":5}, 
       {"userId":44631,"rating":4}, 
       {"userId":47613,"rating":3}, 
       {"userId":49763,"rating":3}, 
       {"userId":58160,"rating":4.5}, 
       {"userId":62249,"rating":3}, 
       {"userId":65923,"rating":4}, 
       {"userId":67507,"rating":4}, 
       {"userId":68259,"rating":3.5}, 
       {"userId":70331,"rating":5}, 
       {"userId":71420,"rating":3.5} 
     ] 
    } 

모든 사용자가 몇 번의 등급을 매겼는지 계산해야합니다. 이것은 평가에 참여하려는 나의 시도입니다.

a = load '/movies_1m.json' using JsonLoader('id:int, title : chararray, genres : { (genre : chararray) }, ratings: { (userId : int, rating: float) } '); 

b = FOREACH a GENERATE FLATTEN(ratings); 

다음 줘 설명 :
b: {ratings::userId: int,ratings::rating: float} 

그냥 내가 평가의 내부에 액세스해야하는 사용자를 계산. 그러나 이것이 성공하지 못하는 지점입니다. 시도 :

c = FOREACH b GENERATE COUNT(ratings); 

오류가 발생합니다.

나는 이런 식으로 뭔가를 얻을 필요가 : 그 집계 작업이기 때문에

{userId: int, rating: float} 

답변

0

당신은 COUNT하기 위해 GROUP해야합니다.

b = FOREACH a GENERATE FLATTEN(ratings); 
gr = GROUP b by ratings::userId; 
c = FOREACH gr GENERATE group,COUNT($1); 
\d c 

출력

주, 당신의 예를 반복에서 사용자의 없음, 그래서 이들은 모두 하나입니다.

(1860,1) 
(9970,1) 
(16929,1) 
(23473,1) 
(23733,1) 
(27584,1) 
(28232,1) 
(29482,1) 
(40976,1) 
(44631,1) 
(47613,1) 
(49763,1) 
(58160,1) 
(62249,1) 
(65923,1) 
(67507,1) 
(68259,1) 
(70331,1) 
(71420,1)