在电影库中查找演员评分最高的5部电影

这篇博客探讨了如何在电影库中找到演员评分最高的5部电影,提供了使用Hive的方法。通过将数据导入Hive,利用其SQL-like查询语言进行排序,实现了对电影评分的高效检索。文章涵盖了实验要求、数据源、分析和代码操作,适合有一定编程基础的读者学习。

在电影库中查找演员评分最高的5部电影


说在前面的话:其实这个题目有四种办法可以完成,只具体说明两种分别是:
  1. 使用Hdfs的Hbase就可以实现。具体是idea这边写代码将数据写入Hbase(要先定义好表结构),java有提供api用于数据的插入,再去虚拟机进入Hbase使用命令就可以查看数据,此方法要求有一定的编程基础与前面几章的认真熟练
  2. 使用Hive。这个对数据进行初步处理再带入Hive,Hive有提供类似于sql语句的查询。此方法简便
  3. 利用pig
  4. sqoop?

如果是自学很欢迎,如果是课程需要请关闭此页面(针对网络学子,我这样说你懂得!)希望各位好好学习,自己思考。


实验要求

  1. 使用hadoop工具
  2. 使用MapReduce 的 Mapper 编写、序列化的使用和排序
  3. 编写MapReduce程序,按评分从高到低排序该演员参演电影(如果同分则优先列出年份较近的,例如2000年上映的A电影和1995年上映的B电影同分,则排序应该为A,B)。

项目数据源

1.使用json格式文件,内容部分如下
部分内容展示

实验分析

  1. 要求使用MapReduce程序,按评分从高到低排序该演员参演电影
  2. 转化为以数据源中的评分以及年份作为排序的依据对数据源进行排序后展示即可

代码分析与实验操作

只使用介绍关于的hive方法
  1. 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数据库哪块白学了?
                }
            }
        }
    }
}
  1. 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;
    }
}
  1. App.java
package com.mytest;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
}

  1. 将运行得到的csv文件,以及打包的jar包发送至虚拟机,同时执行
    在这里插入图片描述

  2. 实验结果进入Hive查看(实验第二题与此题步骤一致,只是筛选进csv的数据不一样,自己更改即可)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值