提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


目录

前言

一、题目要求

二、数据解析

student.txt文件部分数据

三、需求分析及代码编写

总体的思路:

需求1:求DataBase课程的选修人数

需求2:求每个同学不及格的门数

需求3:求各个课程的选课人数

四、打包代码,上传到集群上运行

五、附带一张实现需求2过程详解



前言

学习的记录,有误请指正

需要已经配置好IDEA和hadoop的环境

一、题目要求

1、求DataBase课程的选修人数

2、求每个同学的不及格的门数

3、求各个课程的选课人数

二、数据解析

student.txt文件部分数据

Alger,Algorithm,50
Alger,OperatingSystem,32
Alger,Python,96
Alger,ComputerNetwork,20
Alger,Software,74
Allen,Algorithm,76
Allen,OperatingSystem,70
Allen,Python,10
Allen,Software,76
Alston,Algorithm,78
Alston,DataStructure,74
Alston,Python,96
Alston,Software,28
Alva,DataBase,72
Alva,DataStructure,64
Alva,CLanguage,0
Alva,ComputerNetwork,58
Alva,Software,82
Alvin,DataBase,88
Alvin,Algorithm,96
Alvin,OperatingSystem,26
Alvin,Python,84
Alvin,ComputerNetwork,76
Alvis,Algorithm,18
Alvis,DataStructure,56

该文件分为三部分

第一部分为学生姓名

第二部分为选修课程

第三部分为该学生对应选修个课程的成绩。

很明显的可以看出他们是以英文标点 "," 相隔。

三、需求分析及代码编写

总体的思路:

先通过InputFormat的子方法FileInputFormat将文件上传到hadoop集群当中,这是我们的文本数据将会被按照行划分,形成一个<k1,v1>的一个键值对。其中k1相当于偏移量,v1则是改行的数据。demo:Alger,Algorithm,50被划分成<0 Alger,Algorithm,50>。此时k1的类型时LongWritable,v1的类型是Text

第二步,map阶段,在这个阶段,要继承Mapper重写map函数。我们要做的就是对v1进行一些操作,比如按照什么分隔符进行分割文本数据,分割之后选取那些我们需要的数据,并形成一个新的<k2,v2>,传入到Reducer阶段

第三步,Reducer阶段,这个阶段就是对map阶段过来的数据进行一些汇并进一步汇总,并进一步精细。这要继承Reducer重写reduce函数。

最后,通过OutputFormat的子方法FileOutputFormat将Reducer段的结果输出。

需求1:求DataBase课程的选修人数

Map端:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class Mapper extends Mapper<LongWritable, Text, Text,IntWritable> {@Overrideprotected void map(LongWritable key1, Text value1, Context context) throws IOException, InterruptedException {String data = value1.toString();String[] names = data.split(",");//按照","对行数据进行分割if(names[0].equals("DataBase")) {context.write(new Text(names[1]), new IntWritable(Integer.parseInt(names[2])));}}}

Reducer端:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class Reducer extends Reducer<Text, IntWritable,Text,IntWritable> {@Overrideprotected void reduce(Text key2, Iterable<IntWritable> value2, Context context) throws IOException, InterruptedException {int count = 0;for (IntWritable v : value2) {count++;}context.write(new Text(key2),new IntWritable(count));}
}

Main:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;public class Main {public static void main(String[] agrs) throws Exception{Job job=Job.getInstance(new Configuration());//创建job工作job.setJarByClass(Main.class);//主类是sum.classjob.setMapperClass(Mapper.class);//指定job的mapper和k,v的输出类型job.setMapOutputKeyClass(Text.class);job.setMapOutputValueClass(IntWritable.class);job.setReducerClass(Reducer.class);//指定job的reducer和k,v的输出类型job.setOutputKeyClass(Text.class);job.setOutputValueClass(IntWritable.class);//指定文件路径FileInputFormat.setInputPaths(job,new Path("hdfs://192.168.219.131:8020/user/input/data01.txt"));Path outpath = new Path("hdfs://192.168.219.131:8020/user/output");FileSystem fs = FileSystem.get(conf);if (fs.exists(outpath)) {fs.delete(outpath, true);}//如果outpath存在,则将他删除FileOutputFormat.setOutputPath(job, outpath);job.waitForCompletion(true);}
}

需求2:求每个同学不及格的门数

Map阶段:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class Mapper extends Mapper<LongWritable, Text, Text,IntWritable> {@Overrideprotected void map(LongWritable key1, Text value1, Context context) throws IOException, InterruptedException {String data = value1.toString();String[] names = data.split(",");//按照","对行数据进行分割//names[0]:学生的姓名 names[2]: 学生的成绩       context.write(new Text(names[0]), new IntWritable(Integer.parseInt(names[2])));}}}

Reducer阶段:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class Reducer extends Reducer<Text, IntWritable,Text,IntWritable> {@Overrideprotected void reduce(Text key2, Iterable<IntWritable> value2, Context context) throws IOException, InterruptedException {int count = 0;for (IntWritable v : value2) {if (v.get()>=60)count++;}context.write(new Text(key2),new IntWritable(count));}
}

Main方法同上

需求3:求各个课程的选课人数

Map阶段:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper;import java.io.IOException;public class Mapper extends Mapper<LongWritable, Text, Text,IntWritable> {@Overrideprotected void map(LongWritable key1, Text value1, Context context) throws IOException, InterruptedException {String data = value1.toString();String[] names = data.split(",");//按照","对行数据进行分割//names[]:课程名        context.write(new Text(names[]), new IntWritable(1));}}}

Reducer阶段:

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer;
import java.io.IOException;public class Reducer extends Reducer<Text, IntWritable,Text,IntWritable> {@Overrideprotected void reduce(Text key2, Iterable<IntWritable> value2, Context context) throws IOException, InterruptedException {int count = 0;for (IntWritable v : value2) {count++;}context.write(new Text(key2),new IntWritable(count));}
}

Main方法同上

四、打包代码,上传到集群上运行

将target下面的...jar包保存下来,放到虚拟机中

打开集群:

start-all.sh

使用命令运行我们上传上去的...jar包

hadoop jar Index1.0-SNAPSHOT.jar Index.Main

该命令解释:

Index1.0-SNAPSHOT.jar :为你所打包的名字,以及他存放的路径,我是将所打的包放在了我的Hadoop目录下面,这样比较方便

Index.Main : 是你所写的程序的主类

五、附带一张实现需求2过程详解

hadoop之MapReduce统计选修课程人数,不及格门数,选课人数相关推荐

  1. 以“学生”、“成绩”表为数据源,使用 SQL 视图创建一个名为“学生不及格课程数”统计查询,显示字段为:学号、姓名、不及格门数。

    以"学生"."成绩"表为数据源,使用 SQL 视图创建一个名为"学生不 及格课程数"统计查询,显示字段为:学号.姓名.不及格门数.

  2. select每门可说大于90分_查找选修课程超过3门,并且成绩都在90分以上的学生的学号_学小易找答案...

    [简答题]查询学生姓名中第三个字是"雷"的学号,姓名,课程名称,单科成绩 [单选题]有两个表的记录数分别是7和9,对两个表执行交叉连接查询,查询结果中最多得到()条记录 [简答题] ...

  3. 10-10 查询选修课程超过2门且成绩都在80分以上的学生

    本题目要求编写SQL语句,查询选修课程超过2门且成绩都在80分以上的学生的姓名.专业及总学分. 提示:请使用SELECT语句作答. 表结构: CREATE TABLE `major` (`mno` c ...

  4. 10-231 查询选修课程超过2门且成绩都在80分以上的学生

    分数 10 全屏浏览题目 切换布局 作者 张庆 单位 集美大学 本题目要求编写SQL语句,查询选修课程超过2门且成绩都在80分以上的学生的姓名.专业及总学分. 表结构: 请在这里写定义表结构的SQL语 ...

  5. 一个sql语句的编写 写出不及格门数大于等于2的学生的姓名和平均成绩

    写出不及格门数大于等于2的学生的姓名和平均成绩 表:student sid   name 表:subject cid  cname 表:grade sid  cid  cgrade sql语句为: s ...

  6. hadoop使用mapreduce统计词频_hadoop利用mapreduce运行词频统计(非例程)

    1.运行环境 1.Ubuntu16.04单系统 2.hadoop-3.2.1 2.操作步骤 1.使用eclipse编写map reduce run 函数 2.导出jar包 3.将需要进行词频统计的文件 ...

  7. 多门成绩判断及格与不及格门数

    目的: 输入5门成绩,判断每一门是否及格.最终输出及格的门数和不及格的门数. 代码: #include <iostream> using namespace std; int main( ...

  8. hadoop使用mapreduce统计词频_深圳嘉华学校之Hadoop简介(什么是Map-Reduce-Mapreduce-about云开发)...

    Hadoop简介 Hadoop就是一个实现了Google云计算系统的开源系统,包括并行计算模型Map/Reduce,分布式文件系统HDFS,以及分布式数据库Hbase,同时Hadoop的相关项目也很丰 ...

  9. 求选修课程在2门及以上且都及格的学生号及总平均分 group by count()

    表结构 create table sc(sno int,cno int,grade int) 表数据 insert into sc values (2,1,60),(2,NULL,60),(1,1,6 ...

最新文章

  1. android Adapter剖析理解
  2. C/C++多线程编程之一】VC6.0安装pthread
  3. 网易云信SDK V3.1.0版本发布啦
  4. SpringMVC——Maven项目依赖包
  5. java清屏_【图片】请问java编写中如何做到清屏啊。。。_java吧_百度贴吧
  6. 51 NOD 1363 最小公倍数之和 (欧拉函数思维应用)
  7. python memoryview_memoryview的用法
  8. python获取季度函数_ORACLE时间常用函数(字段取年、月、日、季度)
  9. php 记录时间 分不对,如何解决php获取的时间不对的问题
  10. hdoj1160:FatMouse's Speed(dp+最长递减子序列思想+数组巧妙记录输出)
  11. java 1.4 下载_j2sdk1.4.2
  12. VScode安装并设置SVN插件
  13. django 下载返回文件流
  14. 测度论与概率论基础学习笔记7——3.1积分的定义
  15. 常见的预设分栏包括_Word技巧 || 美观实用的文档分栏,问题解决方案都在这里了!...
  16. python randn_numpy.random.randn()用法
  17. uniapp制作人像动漫化
  18. CSGO 增加机器人数量上限
  19. 对于无线传感网的初步认识
  20. Socket协议编程实践

热门文章

  1. android轮播图简单实现(左右无限滑动,自动轮播)
  2. 拿到pmp的证书就可以做项目经理吗?
  3. 为什么越来越多的人想成为全栈工程师?
  4. Self-Attention与Transformer
  5. linux中使用crontab出现crontab: installing new crontab
  6. untiy发布webgl开发记录
  7. AUTOSAR Port原理概念详解
  8. latex 论文致谢
  9. Endnote无法正确识别引文
  10. Python 浮点数的舍入,round与decimal舍入方式