在电影库中查找演员评分最高的5部电影
说在前面的话:其实这个题目有四种办法可以完成,只具体说明两种分别是:
- 使用Hdfs的Hbase就可以实现。具体是idea这边写代码将数据写入Hbase(要先定义好表结构),java有提供api用于数据的插入,再去虚拟机进入Hbase使用命令就可以查看数据,此方法要求有一定的编程基础与前面几章的认真熟练
- 使用Hive。这个对数据进行初步处理再带入Hive,Hive有提供类似于sql语句的查询。此方法简便
- 利用pig
- sqoop?
如果是自学很欢迎,如果是课程需要请关闭此页面(针对网络学子,我这样说你懂得!)希望各位好好学习,自己思考。
实验要求
- 使用hadoop工具
- 使用MapReduce 的 Mapper 编写、序列化的使用和排序
- 编写MapReduce程序,按评分从高到低排序该演员参演电影(如果同分则优先列出年份较近的,例如2000年上映的A电影和1995年上映的B电影同分,则排序应该为A,B)。
项目数据源
1.使用json格式文件,内容部分如下

实验分析
- 要求使用MapReduce程序,按评分从高到低排序该演员参演电影
- 转化为以数据源中的评分以及年份作为排序的依据对数据源进行排序后展示即可
代码分析与实验操作
只使用介绍关于的hive方法
- TestMain.java
-----首先将json格式的电影信息表转化成csv表,其中FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度,利用缓冲区会先尽量从文件中读入字符数据并放满缓冲区
import com.alibaba.fastjson.JSON;
import java.io.*;
public class TestMain {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("这里改为json文件的路径"));
FileWriter sw = new FileWriter(new File("这里改为csv文件的输出路径"));
//MovieInfo 类可以参考实验1
MovieInfo m=null;
String line;
while((line=br.readLine())!=null){
//Fastjson 把每行的json 字符串转换为对象。
m=JSON.parseObject(line,MovieInfo.class);
if(m.getActor().indexOf("xxx")!=-1){
//Film_page 作为电影ID
String mid=m.getFilm_page();
//取出演员的列表
String[] actors=m.getActor().split(",");
for(String ac:actors){
//把电影数据写入csv文件。csv 表头为 电影名称,评分,演员
sw.append(m.getTitle()+","+m.getStar()+","+ac+"\n");
//注意注意!这里少了一句关闭数据通道,由于缓存空间有限,如果不关闭会导致数据丢失,问我怎么关?你java数据库哪块白学了?
}
}
}
}
}
- MovieInfo.java
----将json数据转化为java对象需要一个bean,且拥有setter和get方法,同时应有序列化和反序列化的实现代码
package com.mytest;
import org.apache.hadoop.io.Writable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class MovieInfo implements Writable {
private String title;
private int year;
private String type;
private float star;
private String director;
private String actor;
private String time;
private String film_page;
public void readFields(DataInput input)throws IOException{
this.title = input.readUTF();
this.year = input.readInt();
this.type = input.readUTF();
this.star = input.readFloat();
this.director = input.readUTF();
this.actor = input.readUTF();
this.time = input.readUTF();
this.film_page = input.readUTF();
}
public void write(DataOutput output)throws IOException{
output.writeUTF(title);
output.writeInt(year);
output.writeUTF(type);
output.writeFloat(star);
output.writeUTF(director);
output.writeUTF(actor);
output.writeUTF(time);
output.writeUTF(film_page);
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public float getStar() {
return star;
}
public void setStar(float star) {
this.star = star;
}
public String getDirector() {
return director;
}
public void setDirector(String director) {
this.director = director;
}
public String getActor() {
return actor;
}
public void setActor(String actor) {
this.actor = actor;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getFilm_page() {
return film_page;
}
public void setFilm_page(String film_page) {
this.film_page = film_page;
}
}
- App.java
package com.mytest;
/**
* Hello world!
*
*/
public class App
{
public static void main( String[] args )
{
System.out.println( "Hello World!" );
}
}
-
将运行得到的csv文件,以及打包的jar包发送至虚拟机,同时执行

-
实验结果进入Hive查看(实验第二题与此题步骤一致,只是筛选进csv的数据不一样,自己更改即可)
这篇博客探讨了如何在电影库中找到演员评分最高的5部电影,提供了使用Hive的方法。通过将数据导入Hive,利用其SQL-like查询语言进行排序,实现了对电影评分的高效检索。文章涵盖了实验要求、数据源、分析和代码操作,适合有一定编程基础的读者学习。

600

被折叠的 条评论
为什么被折叠?



