案例分析-电影评分分析

数据

原始数据展示

原始数据是json数据,大约有100万条数据,样例数据如下:

{"movie":"608","rate":"4","timeStamp":"978301398","uid":"1"}
{"movie":"1246","rate":"4","timeStamp":"978302091","uid":"1"}
{"movie":"1357","rate":"5","timeStamp":"978298709","uid":"2"}
{"movie":"3068","rate":"4","timeStamp":"978299000","uid":"2"}
{"movie":"1537","rate":"4","timeStamp":"978299620","uid":"2"}
{"movie":"647","rate":"3","timeStamp":"978299351","uid":"2"}

json格式说明

json是一种常用的数据格式,广泛的适用于数据的存储和数据的传输。数据是使用大括号,冒号,双引号,中括号组成,这些元素是可以嵌套的。

  • {}表示一个对象
  • Key-value(中间使用冒号分割:)
  • 每一个key-value中间使用逗号分割
  • []中括号表示数组

数据字段含义

电影评分数据包含了电影id,电影评分,评论时间,用户id。

  • movie 电影的id
  • rate 电影评分
  • timestamp 评论时间
  • uid 用户id

需求

1.每个用户评分最高的10部电影评分信息(用户最喜爱的十部电影)

样例结果:

uid=1的前十条数据
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"}
{"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"}
{"movie":"2804","rate":"5","timeStamp":"978300719","uid":"1"}
。。。此处省略六条。。。
uid=2的前十条数据
{"movie":"1357","rate":"5","timeStamp":"978298709","uid":"2"}
{"movie":"2268","rate":"5","timeStamp":"978299297","uid":"2"}
{"movie":"648","rate":"4","timeStamp":"978299913","uid":"2"}
。。。此处省略n条数据。。。

2.每个用户的uid和评分的平均值。

样例结果:

uid=1	平均分=4.98
uid=2	平均分=4.39
uid=3	平均分=4.87
uid=4	平均分=4.98
uid=5	平均分=5.00
。。。此处省略n条数据。。。

3.最大方(评分平均值高)的n个用户的uid和评分平均值。

其实就是在问题2的基础上找出平均数比较高的前n条数据。
样例输出:

uid=5	平均分=5.00
uid=329	平均分=4.98
uid=23	平均分=4.95
uid=435	平均分=4.89
uid=324	平均分=4.89

4.最热门的10部电影id和评价次数。

热门的定义: 评论次数多的就是热门
样例输出数据:

movie=217	评论次数:737284
movie=2345	评论次数:733213
movie=748	评论次数:684372
。。。此处省略七条数据。。。

5.评价最高的10部电影id和评分均值

样例数据输出:

movie=5	平均分=5.00
movie=329	平均分=4.98
movie=23	平均分=4.95
movie=435	平均分=4.89
movie=324	平均分=4.89
。。。此处省略5条数据。。。

需求实现

json解析测试

json解析是把数据解析成对象,所以需要先创建json数据相对应的javabean
json对应的javaBean

package cn.pengpeng.day01.bean;

/**
 * json数据对应的javabean
 * @author pengpeng
 */
public class RateBean {
	//{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
	private String movie;
	private int rate;
	private String timeStamp;
	private String uid;
	public String getMovie() {
		return movie;
	}
	public void setMovie(String movie) {
		this.movie = movie;
	}
	public int getRate() {
		return rate;
	}
	public void setRate(int rate) {
		this.rate = rate;
	}
	public String getTimeStamp() {
		return timeStamp;
	}
	public void setTimeStamp(String timeStamp) {
		this.timeStamp = timeStamp;
	}
	public String getUid() {
		return uid;
	}
	public void setUid(String uid) {
		this.uid = uid;
	}
	@Override
	public String toString() {
		return "RateBean [movie=" + movie + ", rate=" + rate + ", timeStamp=" + timeStamp + ", uid=" + uid + "]";
	}
}

测试fastjson使用

package cn.pengpeng.day01.test;

import com.alibaba.fastjson.JSON;

import cn.pengpeng.day01.bean.RateBean;

/**
 * 测试json数据,json和javabean相互转换
 */
public class TestJson {
	public static void main(String[] args) {
		String json = "{\"movie\":\"1193\",\"rate\":\"5\",\"timeStamp\":\"978300760\",\"uid\":\"1\"}";
		RateBean bean = JSON.parseObject(json, RateBean.class);
		System.out.println(bean);
		
		Object object = JSON.toJSON(bean);
		String string = object.toString();
		System.out.println(object);	
	}
}

1.每个用户评分最高的10部电影评分信息-实现


2.每个用户的uid和评分的平均值-实现


3.最大方(评分平均值高)的n个用户的uid和评分平均值-实现


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个很典型的MapReduce案例。 首先,我们需要明确输入数据的格式,假设我们有一个大的电影评分数据集,每一行是一个评分记录,格式为: ``` <用户ID, 电影ID, 评分, 时间戳> ``` 接下来,我们需要进行数据预处理,将评分数据按照电影ID进行分组,得到每个电影评分记录。然后,我们可以利用MapReduce进行数据分析,统计每个电影的平均评分。具体的MapReduce过程如下: - Map阶段 Map阶段的输入是评分数据集中的每一行记录,我们需要将每一行记录转化为一个键值对,以电影ID作为键,以评分和计数器作为值,即: ``` <电影ID, (评分, 1)> ``` Map函数的实现非常简单,只需要将评分数据解析出电影ID和评分,然后将它们以键值对的形式输出即可。 - Reduce阶段 Reduce阶段的输入是Map阶段输出的键值对,以电影ID作为键,以评分和计数器的列表作为值,即: ``` <电影ID, [(评分1, 1), (评分2, 1), ..., (评分n, 1)]> ``` Reduce函数的主要任务是统计每个电影的平均评分,具体实现如下: ``` def reduce(movie_id, values): # 统计评分总和和评分个数 total_score, count = 0, 0 for score, c in values: total_score += score count += c # 计算平均评分 avg_score = total_score / count # 输出结果 print('%s\t%f' % (movie_id, avg_score)) ``` 最后,整个MapReduce过程的输出结果是一个以电影ID作为键,以平均评分作为值的列表,即: ``` <电影ID, 平均评分> ``` 这样,我们就得到了每个电影的平均评分。如果我们还想要加上电影的名称和年份等信息,可以将电影ID作为键,以电影名称和年份等信息作为值进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值