2017-12-19 4 views
0

Ich habe eine Liste von Filmen mit Bewertungen von Benutzer.Hadoop PIG mit verschachtelten 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} 
     ] 
    } 

Ich muss zählen, wie viele Bewertungen von jedem Benutzer vorgenommen werden. Dies ist mein Versuch, die Bewertungen zu bekommen.

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

dann

b = FOREACH a GENERATE FLATTEN(ratings); 

beschreiben mir geben folgende:

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

nur die Benutzer ich das Innere der Bewertungen zugreifen müssen zählen. Aber das ist der Punkt, wo es nicht gelingt. Ich habe das versucht:

c = FOREACH b GENERATE COUNT(ratings); 

es wird mir ein Fehler.

Ich brauche so etwas zu bekommen:

{userId: int, rating: float} 

Antwort

0

Sie müssen GROUP um COUNT da, dass ein Aggregat Betrieb ist.

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

Ausgabe

Hinweis, keine der Benutzer in Ihrem Beispiel wiederholen, so sind diese alle ein.

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