MapReduce案例----影评分析(年份,电影id,电影名字,平均评分)

题目:

 1 现有如此三份数据:(这里只需用后两份)
 2 1、users.dat    数据格式为:  2::M::56::16::70072
 3 对应字段为:UserID BigInt, Gender String, Age Int, Occupation String, Zipcode String
 4 对应字段中文解释:用户id,性别,年龄,职业,邮政编码
 5  
 6 2、movies.dat        数据格式为:1::Toy Story (1995)::Animation|Children's|Comedy  ;  2::Jumanji (1995)::Adventure|Children's|Fantasy  ;  3::Grumpier Old Men (1995)::Comedy|Romance
 7 对应字段为:MovieID BigInt, Title String, Genres String
 8 对应字段中文解释:电影ID,电影名字,电影类型
 9  
10 3、ratings.dat        数据格式为:  1::1193::5::978300760  ;  1::661::3::978302109  ;  1::914::3::978301968
11 对应字段为:UserID BigInt, MovieID BigInt, Rating Double, Timestamped String
12 对应字段中文解释:用户ID,电影ID,评分,评分时间戳
13  
14 用户ID,电影ID,评分,评分时间戳,性别,年龄,职业,邮政编码,电影名字,电影类型
15 userid, movieId, rate, ts, gender, age, occupation, zipcode, movieName, movieType
16 需求:
17     关联两张表。
18     计算每部电影的平均评分,并按评分大小进行排序。评分一样,按照电影名排序。
191):按照年份进行分组,要求结果展示形式:
20         年份,电影id,电影名字,平均分。

思路:

  首先从 ratings.dat 中计算出电影id,平均评分。得出一个中间表。

  通过分析,中间表比 movis.dat 要小,所以优先考虑将中间表加载到内存中,写入到一个hashmap中,做 map join。

  Map 端处理movies.dat 中的数据,根据电影 id 关联 hashmap,得到该电影的平均评分,并提取出电影的年份。

  将年份,电影id,电影名字,平均评分封装到一个对象中,然后自定义排序规则。按照电影平均评分大小排序。

  然后自定义分区,将相同年份的分到一个分区中。使得相同年份的数据出现在一个文件中。

求出平均评分代码:

 1 package com.lhb.demo;
 2 import org.apache.hadoop.conf.Configuration;
 3 import org.apache.hadoop.fs.FileSystem;
 4 import org.apache.hadoop.fs.Path;
 5 import org.apache.hadoop.io.DoubleWritable;
 6 import org.apache.hadoop.io.LongWritable;
 7 import org.apache.hadoop.io.Text;
 8 import org.apache.hadoop.mapreduce.Job;
 9 import org.apache.hadoop.mapreduce.Mapper;
10 import org.apache.hadoop.mapreduce.Reducer;
11 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
12 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
13 import java.io.IOException;
14 
15 public class Test1AvgRate {
16     //map端
17     public static class Test1AvgRateMapper extends Mapper<LongWritable, Text, LongWritable, DoubleWritable> {
18         protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
19             String[] split = value.toString().split("::");
20             if (split.length >= 4) {
21                 context.write(new LongWritable(Long.valueOf(split[1])), new DoubleWritable(Double.valueOf(split[2])));
22             }
23         }
24     }
25     //reducer端
26     public
  • 4
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值