在idea用MapReduce编写在电影库中查找我的演员评分最高的5部电影
时间: 2024-03-11 15:43:33 浏览: 129
好的,需要注意的是,MapReduce 一般用于大规模数据处理,对于小规模的数据集可能会有些繁琐。但是,为了练习 MapReduce 的使用,我们可以尝试使用它来处理电影库中的数据。
首先,你需要搭建 Hadoop 环境,并在 IDEA 中配置 Hadoop 的相关设置。然后,你可以按照以下步骤进行:
1. 创建一个 MapReduce 作业,在代码编辑界面中编写 Map 和 Reduce 函数。
2. 在 Map 函数中,读取电影和演员数据,将每个演员和他参演的电影评分进行映射。
3. 在 Reduce 函数中,对每个演员的电影评分进行合并,并取出评分最高的5部电影。
4. 执行 MapReduce 作业并输出结果。
下面是一个简单的示例代码,你可以根据实际情况进行修改:
```java
import java.io.IOException;
import java.util.*;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.*;
import org.apache.hadoop.mapreduce.*;
public class Main {
public static void main(String[] args) throws Exception {
Configuration conf = new Configuration();
Job job = Job.getInstance(conf, "top-5-movies");
job.setJarByClass(Main.class);
job.setMapperClass(MapperClass.class);
job.setReducerClass(ReducerClass.class);
job.setMapOutputKeyClass(Text.class);
job.setMapOutputValueClass(DoubleWritable.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(DoubleWritable.class);
job.setInputFormatClass(SequenceFileInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
SequenceFileInputFormat.addInputPath(job, new Path("/path/to/movie-data.seq"));
TextOutputFormat.setOutputPath(job, new Path("/path/to/output"));
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
public static class MapperClass extends Mapper<Text, Text, Text, DoubleWritable> {
private final Text actorName = new Text();
private final DoubleWritable rating = new DoubleWritable();
public void map(Text key, Text value, Context context) throws IOException, InterruptedException {
String[] parts = value.toString().split("\\t");
String movieTitle = parts[0];
double movieRating = Double.parseDouble(parts[1]);
String[] actors = parts[2].split("\\|");
for (String actor : actors) {
actorName.set(actor);
rating.set(movieRating);
context.write(actorName, rating);
}
}
}
public static class ReducerClass extends Reducer<Text, DoubleWritable, Text, DoubleWritable> {
private final TreeMap<Double, String> topMovies = new TreeMap<>();
public void reduce(Text key, Iterable<DoubleWritable> values, Context context) throws IOException, InterruptedException {
double totalRating = 0;
int count = 0;
for (DoubleWritable value : values) {
totalRating += value.get();
count++;
}
if (count > 0) {
double avgRating = totalRating / count;
String actorName = key.toString();
String movieTitle = topMovies.get(avgRating);
if (movieTitle == null || !movieTitle.equals(movieTitle)) {
topMovies.put(avgRating, movieTitle);
if (topMovies.size() > 5) {
topMovies.remove(topMovies.firstKey());
}
}
}
}
public void cleanup(Context context) throws IOException, InterruptedException {
for (Map.Entry<Double, String> entry : topMovies.descendingMap().entrySet()) {
double rating = entry.getKey();
String movieTitle = entry.getValue();
context.write(new Text(movieTitle), new DoubleWritable(rating));
}
}
}
}
```
在代码中,你需要将 `/path/to/movie-data.seq` 修改为你的电影数据文件路径,以及 `/path/to/output` 修改为你的输出文件路径。
然后,执行代码,你就可以在输出文件中看到你的演员评分最高的5部电影了。
阅读全文