已知两张数据表,其中表一存储的是学生编号、学生姓名;表二存储的是学生编号、考试科目、考试成绩;编写mapreduce程序,汇总两张表数据为一张统一表格。

表一:

  1. A001 zhangsan
  2. A002 lisi
  3. A003 wangwu
  4. A004 zhaoliu
  5. A005 tianqi

表二:

  1. A001 math
  2. A002 math
  3. A003 math
  4. A004 math
  5. A005 math
  6. A001 english
  7. A002 english
  8. A003 english
  9. A004 english
  10. A005 english
  11. A001 computer
  12. A002 computer
  13. A003 computer
  14. A004 computer
  15. A005 computer

正确结果:

执行java程序,打印出part-r-00000中数据:

代码如下(由于水平有限,不保证完全正确,如果发现错误欢迎指正):

  1. package com;
  2.  
  3. import java.io.IOException;
  4. import java.util.ArrayList;
  5. import java.util.List;
  6.  
  7. import org.apache.hadoop.conf.Configuration;
  8. import org.apache.hadoop.fs.FileSystem;
  9. import org.apache.hadoop.fs.Path;
  10. import org.apache.hadoop.io.Text;
  11. import org.apache.hadoop.mapreduce.Job;
  12. import org.apache.hadoop.mapreduce.Mapper;
  13. import org.apache.hadoop.mapreduce.Reducer;
  14. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  15. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  16.  
  17. public class Test {
  18. public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
  19. Configuration config = new Configuration();
  20. config.set("fs.defaultFS", "hdfs://192.168.0.100:9000");
  21. config.set("yarn.resourcemanager.hostname", "192.168.0.100");
  22.  
  23. FileSystem fs = FileSystem.get(config);
  24.  
  25. Job job = Job.getInstance(config);
  26.  
  27. job.setJarByClass(Test.class);
  28.  
  29. //设置所用到的map类
  30. job.setMapperClass(myMapper.class);
  31. job.setMapOutputKeyClass(Text.class);
  32. job.setMapOutputValueClass(Text.class);
  33.  
  34. //设置用到的reduce类
  35. job.setReducerClass(myReducer.class);
  36. job.setOutputKeyClass(Text.class);
  37. job.setOutputValueClass(Text.class);
  38.  
  39. //设置输入输出地址
  40. FileInputFormat.addInputPath(job, new Path("/day19/"));
  41.  
  42. Path path = new Path("/output5/");
  43.  
  44. if(fs.exists(path)){
  45. fs.delete(path, true);
  46. }
  47.  
  48. //指定文件的输出地址
  49. FileOutputFormat.setOutputPath(job, path);
  50.  
  51. //启动处理任务job
  52. boolean completion = job.waitForCompletion(true);
  53. if(completion){
  54. System.out.println("Job Success!");
  55. }
  56. }
  57.  
  58. public static class myMapper extends Mapper<Object, Text, Text, Text> {
  59.  
  60. // 实现map函数
  61. public void map(Object key, Text value, Context context) throws IOException, InterruptedException {
  62. String temp=new String();// 左右表标识
  63. String values=value.toString();
  64. String words[]=values.split("\t");
  65.  
  66. String mapkey = new String();
  67. String mapvalue = new String();
  68.  
  69. //左表:A001,zhangsan
  70. if (words.length==) {
  71. mapkey = words[];
  72. mapvalue =words[];
  73. temp = "";
  74.  
  75. }else{
  76. //右表:A001,math,80
  77. mapkey = words[];
  78. mapvalue =words[]+"="+words[];
  79. temp = "";
  80. }
  81.  
  82. // 输出左右表
  83. //左表:(A001,1+zhangsan)
  84. //右表:(A001,2+math=80)
  85. context.write(new Text(mapkey), new Text(temp + "+"+ mapvalue));
  86. System.out.println("key:"+mapkey+"---value:"+mapvalue);
  87. }
  88. }
  89.  
  90. //reduce解析map输出,将value中数据按照左右表分别保存
  91. public static class myReducer extends Reducer<Text, Text, Text, Text> {
  92. // 实现reduce函数
  93. public void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException {
  94.  
  95. //学生的数组
  96. List<String> people =new ArrayList<String>();
  97.  
  98. //成绩的数组
  99. List<String> score =new ArrayList<String>();
  100.  
  101. //(A001,{1+zhangsan,2+math=80})
  102. for(Text value:values){
  103. // 取得左右表标识
  104. char temp = (char) value.charAt(); //
  105. String words[] = value.toString().split("[+]"); //1,zhangsan
  106. if(temp == ''){
  107. people.add(words[]);
  108. }
  109.  
  110. if(temp == ''){
  111. score.add(words[]);
  112. }
  113. }
  114.  
  115. //遍历两次,求出笛卡尔积
  116. for (String p : people) {
  117. for (String s : score) {
  118. context.write(new Text(p), new Text(s));
  119. }
  120. }
  121. }
  122. }
  123. }

如果您认为这篇文章还不错或者有所收获,您可以通过右边的“打赏”功能 打赏我一杯咖啡【物质支持】,也可以点击下方的【好文要顶】按钮【精神支持】,因为这两种支持都是使我继续写作、分享的最大动力!

MapReduce:汇总学生表和成绩表为----学生成绩表的更多相关文章

  1. java例题_50 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

    1 /*50 [程序 50 文件 IO] 2 题目:有五个学生,每个学生有 3 门课的成绩,从键盘输入以上数据(包括学生号,姓名,三门课成 3 绩),计算出平均成绩,将原有的数据和计算出的平均分数存放 ...

  2. 《MySQL数据操作与查询》- 维护学生信息、老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息

    综合项目需求 一.系统整体功能 系统需支持以下功能: 维护学生信息.老师信息和成绩信息 支持按多种条件组合查询学生信息和成绩信息 学生 Student(id,班级id,学号,姓名,性别,电话,地址,出 ...

  3. Java基础知识强化之集合框架笔记49:键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)按照总分从高到低输出到控制台

    1. 键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩)按照总分从高到低输出到控制台: 分析: A: 定义学生类    B: 创建一个TreeSet集合       C: 总分从高到底如何实现 ...

  4. /* * 有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 *(包括学生号,姓名,三门课成绩),计算出平均成绩, *将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。 */

    1.Student类:类中有五个变量,分别是学号,姓名,三门成绩 package test3; public class Student { private int num; private Stri ...

  5. 代码实现:有五个学生,每个学生有3门课的成绩,从键盘输入以上数据 (包括学生号,姓名,三门课成绩),计算出平均成绩,将原有的数据和计算出的平均分数存放在磁盘文件"stud"中。

    import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.ut ...

  6. 【HIVE高级笔试必备题型】(组内topN、相邻行的值比较问题)求语文大于数学_/_求文科大于理科成绩的学生

    Hive SQL练习之成绩分析 数据:[id, 学号,班级,科目,成绩] 1,1,1,yuwen,80 2,1,1,shuxue,85 3,2,1,yuwen,75 4,2,1,shuxue,70 5 ...

  7. Mybatis高级:Mybatis注解开发单表操作,Mybatis注解开发多表操作,构建sql语句,综合案例学生管理系统使用接口注解方式优化

    知识点梳理 课堂讲义 一.Mybatis注解开发单表操作 *** 1.1 MyBatis的常用注解 之前我们在Mapper映射文件中编写的sql语句已经各种配置,其实是比较麻烦的 而这几年来注解开发越 ...

  8. 【JAVA】【作业向】第一题:本学期一班级有n名学生,m门课程。现要求对每门课程的成绩进行统计:平均成绩、最高成绩、最低成绩,并统计考试成绩的分布律。

    1.预备知识:动态数组Array实现: 2.解题过程需要理解的知识:吧唧吧唧吧唧吧唧 不想做了 就用了最简单的方法 和c语言类似 java版本 `import java.util.Scanner; / ...

  9. Java初学者作业——编写Java程序,输入一个学生的5门课程的成绩,求其平均分。

    返回本章节 返回作业目录 需求说明: 编写Java程序,输入一个学生的5门课程的成绩,求其平均分.计算平均成绩,需要将每一门课程的成绩逐步累加到总成绩中,使用 for 循环实现,然后求出平均分. 实现 ...

随机推荐

  1. CGContextRef用法

    本文转载至 http://blog.csdn.net/perfect_promise/article/details/7660220 quartz 是主要的描画接口,支持基于路径的描画. 抗锯齿渲染. ...

  2. 获取TXT文件,解决读取TXT乱码问题,查找所输入字是否在TXT文件中,

    /// <summary> /// 查看是否存在 /// </summary> /// <param name="str"></param ...

  3. dubbo zookeeper报错failed to connect to server , error message is:No route to host

    failed to connect to server , error message is:No route to host 转自:http://blog.csdn.net/miaohongyu1/ ...

  4. javascript的解析过程

    引言: javascript是一种解释型的脚本语言,它不同于java或者c#这种编译语言,不需要编译成游览器可识别的语言,而是由游览器动态解析和执行的.(本身就是游览器可以直接识别,javascrip ...

  5. 第00章—IDEA

    spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxia ...

  6. Career Planning:Developers Best Practices Tutorial

    This small tutorial is based on my past 16+ years of experience in software development industry. I ...

  7. window下安装mysql详细步骤

    1.下载安装包 打开mysql官网下载页面:http://dev.mysql.com/downloads/mysql/ 1.选择相应的版本和平台 2.mysql配置 打开刚刚解压的文件夹F:\mysq ...

  8. python内存泄露查找

    1 前言: 1.1 像Java程序一样,虽然Python本身也有垃圾回收的功能,但是同样也会产生内存泄漏的问题 1.2 在Python程序里,内存泄漏是由于一个长期持有的对象不断的往一个dict或者l ...

  9. 科班学习java遇到瓶颈,每天云里雾里怎么办?

    声明:这个问题困扰了我好久,今天在知乎找到了答案.知乎链接https://www.zhihu.com/question/24240982,感谢大神@Tony He的回答. 作者:Tony He链接:h ...

  10. Spark 1.5新特性介绍

    一.DataFrame执行后端优化(Tungsten第一阶段) DataFrame可以说是整个Spark项目最核心的部分,在1.5这个开发周期内最大的变化就是Tungsten项目的第一阶段已经完成.主 ...