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
    评论
以下是一个简单的 Hadoop MapReduce 数据清洗示例,假设我们有一个包含爬取数据的文本文件,每行包含一个 URL 和相应的网页内容。我们需要去除噪声,例如 HTML 标签、空格、换行符等,并删除重复的 URL。 Mapper 阶段: ```java public class DataCleanMapper extends Mapper<LongWritable, Text, Text, Text> { private Text url = new Text(); private Text content = new Text(); public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { String line = value.toString(); String[] parts = line.split("\t"); if (parts.length == 2) { url.set(parts[0]); content.set(cleanData(parts[1])); context.write(url, content); } } private String cleanData(String data) { // 进行数据清洗,例如去除 HTML 标签、空格、换行符等 return cleanedData; } } ``` Reducer 阶段: ```java public class DataCleanReducer extends Reducer<Text, Text, Text, Text> { public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { Set<String> uniqueValues = new HashSet<>(); for (Text value : values) { uniqueValues.add(value.toString()); } for (String uniqueValue : uniqueValues) { context.write(key, new Text(uniqueValue)); } } } ``` Driver 阶段: ```java public class DataCleanJob { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); Job job = Job.getInstance(conf, "DataClean"); job.setJarByClass(DataCleanJob.class); job.setMapperClass(DataCleanMapper.class); job.setReducerClass(DataCleanReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(Text.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` 在上面的代码示例中,我们首先在 Mapper 阶段对每行数据进行清洗,然后将 URL 和清洗后的网页内容作为键值对输出。在 Reducer 阶段,我们使用一个 Set 数据结构来去除重复的内容,并将 URL 和不重复的网页内容作为键值对输出。最后,在 Driver 阶段,我们设置了输入和输出路径,并运行了 MapReduce 作业。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值