Как найти Топ 10 самых просматриваемых фильмов с их названием в mapreduce - PullRequest
0 голосов
/ 31 мая 2018

Я набор данных фильма и набор данных рейтинга, как это

movies.txt           MovieID – Title – Genres
ratings.txt          UserID – MovieID – Rating – Timestamp

Я пытаюсь написать работу MR, которая найдет лучшие 10 фильмов с их названием. Я написал работу, которая даетназвание фильма и вид. Как это

 American Beauty (1999)::3428
 Star Wars: Episode IV – A New Hope (1977)::2991
 Star Wars: Episode V – The Empire Strikes Back (1980)::2990
 Star Wars: Episode VI – Return of the Jedi (1983)::2883
 ........................................................

Я публикую код, который я использовал для разработки задания,

Карта для данных фильма

  import java.io.IOException;
  import org.apache.hadoop.io.Text;
  import org.apache.hadoop.mapreduce.Mapper;

  public class MoviesDataMapper extends Mapper<Object, Text, Text, Text> {
  private Text movieId = new Text();
  private Text outvalue = new Text();
  @Override
   public void map(Object key, Text values, Context context) throws 
 IOException, InterruptedException {
   String data = values.toString();
    String[] field = data.split("::", -1);
  if (null != field && field.length == 3 && field[0].length() > 0) {
  movieId.set(field[0]);
  outvalue.set("M" + field[1]);
  context.write(movieId, outvalue);
  }
 }

Карта рейтингов

    import java.io.IOException;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.mapreduce.Mapper;
     public class RatingDataMapper extends Mapper<Object, Text, Text, Text> {
     private Text movieId = new Text();
     private Text outvalue = new Text();
     @Override
    public void map(Object key, Text values, Context context) throws 
        IOException, InterruptedException {
      String data = values.toString();
      String[] field = data.split("::", -1);
       if (null != field && field.length == 4 && field[0].length() > 0) {
       movieId.set(field[1]);
       outvalue.set("R" + field[2]);
       context.write(movieId, outvalue);
   }
 }

Код редуктора

    public class MoviesRatingJoinReducer extends Reducer<Text, Text, Text, 
    Text> {
    private ArrayList<Text> listMovies = new ArrayList<Text>();
    private ArrayList<Text> listRating = new ArrayList<Text>();
    @Override
    public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
    listMovies.clear();
    listRating.clear();
    for (Text text : values) {
    if (text.charAt(0) == 'M') {
    listMovies.add(new Text(text.toString().substring(1)));
   } else if (text.charAt(0) == 'R') {
  listRating.add(new Text(text.toString().substring(1)));
   }
 }
     executeJoinLogic(context);
  }
  private void executeJoinLogic(Context context) throws IOException, 
   InterruptedException {
    if (!listMovies.isEmpty() && !listRating.isEmpty()) {
     for (Text moviesData : listMovies) {
    context.write(moviesData, new Text(String.valueOf(listRating.size())));
    }
  }
}
  }

Я не могу представить логику, по которой я могу найти топ-10 самых рейтинговых фильмов. Пожалуйста, помогите.

...