2017-12-19 8 views
0

私はユーザーによる評価の映画のリストを持っています。Hadoop PIG(ネストされたJson)

{"_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} 
     ] 
    } 

すべてのユーザーが何レーティングを行ったかをカウントする必要があります。これは格付けに入る私の試みです。

b: {ratings::userId: int,ratings::rating: float} 

ちょうど私が評価の内部にアクセスする必要があるユーザーをカウントする:

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); 

は私に次のことを与えて説明します。しかし、これは成功していないポイントです。私はこれを試しました:

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 

出力

注意、あなたの例の繰り返しでユーザーのどれも、ので、これらはすべて1です。

(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)