需求:

编写MapReduce程序算出高峰时间段(如9-10点)哪张表被访问的最频繁的表,以及这段时间访问这张表最多的用户,以及这个用户访问这张表的总时间开销。

测试数据:


TableName(表名),Time(时间),User(用户),TimeSpan(时间开销)

*t003 6:00 u002 180

*t003 7:00 u002 180

*t003 7:08 u002 180

*t003 7:25 u002 180

*t002 8:00 u002 180

*t001 8:00 u001 240

*t001 9:00 u002 300

*t001 9:11 u001 240

*t003 9:26 u001 180

*t001 9:39 u001 300

*t001 10:00 u001 200


代码

方法一:

package com.table.main;

import java.io.IOException;
import java.util.HashMap; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class TableUsed { public static class MRMapper extends Mapper<LongWritable, Text, Text, Text> {
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] split = value.toString().substring(1).split("\\s+");
Long time = Long.parseLong(split[1].charAt(0) + "");
// 筛选9-10点使用过的表
if (time == 9 || time == 10) {
context.write(new Text(split[0]), new Text(split[2] + ":" + split[3]));
}
}
} public static class MRReducer extends Reducer<Text, Text, Text, Text> {
// 存放使用量最大的表的表名及用户
public static HashMap<String, HashMap<String, Integer>> map = new HashMap<String, HashMap<String, Integer>>();
// 最大用使用量
public static int max_used_num = 0;
// 使用量最大的表
public static String table = ""; protected void reduce(Text key, Iterable<Text> values, Context context) throws IOException, InterruptedException { HashMap<String, Integer> user_map = new HashMap<String, Integer>(); int table_used_num = 0;
for (Text t : values) {
table_used_num++;
String[] split = t.toString().split(":"); // 如map中已经存在的用户则把使用时间叠加 不存在则添加该用户
if (user_map.get(split[0]) == null) {
user_map.put(split[0], Integer.parseInt(split[1]));
} else {
Integer use_time = user_map.get(split[0]);
use_time += Integer.parseInt(split[1]);
user_map.put(split[0], use_time);
}
}
if (table_used_num > max_used_num) {
map.put(key.toString(), user_map);
table = key.toString();
max_used_num = table_used_num;
}
} protected void cleanup(Context context) throws IOException, InterruptedException { // 循环map,查出使用时间最长的用户信息
HashMap<String, Integer> map2 = map.get(table); int max = 0;
String max_used_user = "";
for (HashMap.Entry<String, Integer> m : map2.entrySet()) {
if (m.getValue() > max) {
max = m.getValue();
max_used_user = m.getKey();
}
}
context.write(new Text(table), new Text("\t" + max_used_user + "\t" + map2.get(max_used_user)));
}
} public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf);
job.setJarByClass(TableUsed.class); job.setMapperClass(MRMapper.class);
job.setReducerClass(MRReducer.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); FileInputFormat.setInputPaths(job, new Path("hdfs://hadoop5:9000/input/table_time.txt"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://hadoop5:9000/output/put2"));
System.out.println(job.waitForCompletion(true) ? 1 : 0);
}
}
缺点:只算出使用时间最长的用户,没有判断该用户是否是使用次数最多的

方法二:

package com.table.main;

import java.io.IOException;
import java.util.HashMap; import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class TableUsed { public static class MRMapper extends Mapper<LongWritable, Text, Text, Text> {
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
String[] split = value.toString().substring(1).split("\\s+");
Long time = Long.parseLong(split[1].charAt(0) + "");
// 筛选9-10点使用过的表
if (time == 9 || time == 10) {
context.write(new Text(split[0]), new Text(split[2] + ":" + split[3]));
}
}
} public static class MRReducer extends Reducer<Text, Text, Text, Text> {
// 表的最大使用次数 使用该表最多的用户
public static int max_used_num = 0, max_user_used = 0;
// 使用量最大的表 使用该表最多的用户名
public static String max_used_table = "", user_name = "";
// 使用次数最多的用户的 使用时间
public static Integer user_used_time = 0; protected void reduce(Text key, Iterable<Text> values, Context context)
throws IOException, InterruptedException { HashMap<String, Integer> user_map = new HashMap<String, Integer>();
HashMap<String, Integer> user_used_map = new HashMap<String, Integer>(); int table_used_num = 0;// 表的使用次数
Integer use_num = 0;// 用户使用次数
Integer use_time = 0;//使用时间
String username = "";//用户名 for (Text t : values) {
table_used_num++;
String[] split = t.toString().split(":"); // 如map中已经存在的用户则把使用时间叠加 不存在则添加该用户
if (user_map.get(split[0]) == null) { user_map.put(split[0], Integer.parseInt(split[1]));
user_used_map.put(split[0], 1);
} else {
use_time = user_map.get(split[0]);
use_time += Integer.parseInt(split[1]);
user_map.put(split[0], use_time); use_num = user_used_map.get(split[0]);
use_num ++;
user_used_map.put(split[0], use_num);
} /**
* 判断该用户是否为此表使用次数最多的,
* 是则存进user_map和user_used_map,否则不存;
* 由于只需要求使用量最多的用户,因此使用量不是最多用户没有必要存在于map中
*/
if (use_num > max_user_used) {
username = split[0];
max_user_used = use_num;
user_used_time = use_time;
//此处也可以不remove()
user_used_map.remove(split[0]);
user_map.remove(split[0]);
}
} if (table_used_num > max_used_num) {
max_used_table = key.toString();
max_used_num = table_used_num;
user_name = username;
}
} protected void cleanup(Context context) throws IOException, InterruptedException { context.write(new Text(max_used_table), new Text(max_user_used + "\t" + user_name + "\t" + user_used_time));
}
} public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { Configuration conf = new Configuration(); Job job = Job.getInstance(conf);
job.setJarByClass(TableUsed.class); job.setMapperClass(MRMapper.class);
job.setReducerClass(MRReducer.class); job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class); FileInputFormat.setInputPaths(job, new Path("hdfs://hadoop5:9000/input/table_time.txt"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://hadoop5:9000/output/put6"));
System.out.println(job.waitForCompletion(true) ? 1 : 0);
}
}

MapReduce数据筛选的更多相关文章

  1. ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)

    系列目录 前言 听标题的名字似乎是一个非常牛X复杂的功能,但是实际上它确实是非常复杂的,我们本节将演示如何实现对数据,进行组合查询(数据筛选) 我们都知道Excel中是如何筛选数据的.就像下面一样 他 ...

  2. DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样

    '近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. ...

  3. layui table 根据条件改变更换表格颜色 高亮显示 数据筛选

    请问想让当layui表格的某个字段符合某个条件的时候,让该行变颜色.这样可以实现么. layui数据表格怎么更换表格颜色 layui表格 通过判断某一行中的某一列的值进行设置这一行的颜色 LayUI之 ...

  4. C#进行数据筛选(二)

    这里介绍LINQ+Lambda表达式进行数据筛选的方式 这里是第一种方式,还是使用了if条件语句去判断,根据选择的条件去筛选出我所需要的数据 public GxAnaly SelectDay(stri ...

  5. C#进行数据筛选(一)

    这里介绍数据筛选的第一种方式,不用过滤器,给新手看得 public DataTable SourceList(string Wmain, string OrderNo, string Process) ...

  6. python之pandas数据筛选和csv操作

    本博主要总结DaraFrame数据筛选方法(loc,iloc,ix,at,iat),并以操作csv文件为例进行说明 1. 数据筛选 a b c (1)单条件筛选 df[df[] # 如果想筛选a列的取 ...

  7. Pandas 数据筛选,去重结合group by

    Pandas 数据筛选,去重结合group by 需求 今小伙伴有一个Excel表, 是部门里的小伙9月份打卡记录, 关键字段如下: 姓名, 工号, 日期, 打卡方式, 时间, 详细位置, IP地址. ...

  8. 【杂记】mysql 左右连接查询中的NULL的数据筛选问题,查询NULL设置默认值,DATE_FORMAT函数

    MySQL左右连接查询中的NULL的数据筛选问题 xpression 为 Null,则 IsNull 将返回 True:否则 IsNull 将返回 False. 如果 expression 由多个变量 ...

  9. 4-Pandas之数据类型与数据筛选

    一.数据类型 1.Pandas的数据类型主要结合了pandas和numpy两个模块中的数据类型,包括以下几种: float int bool datetime64[ns]------>日期类型 ...

随机推荐

  1. 用Java自定义一个定时器

    1.先定义一个监听类: import java.util.Date; import java.util.Timer; import javax.servlet.ServletContextEvent; ...

  2. Volley使用详细说明

    前一篇粗略的介绍了一下Volley,并在最后附上了一段使用代码,这一篇详细的介绍一下Volley的使用.前面也说了Volley主要获取JSON对象和图片加载,这里也分为两部分介绍. 1.获取JSON对 ...

  3. openvswitch总述

    前面用了两天时间了解了OpenvSwitch的结构,今天参考其他资料加自己的心得做个总结 一. openvswitch的安装和使用 在前一篇文章中详细的介绍了OpenvSwitch的安装和使用,不再赘 ...

  4. 【BZOJ3829】[Poi2014]FarmCraft 树形DP(贪心)

    [BZOJ3829][Poi2014]FarmCraft Description In a village called Byteville, there are   houses connected ...

  5. mysql5.7 安装版安装

    参考 http://dev.mysql.com/doc/refman/5.7/en/installing.html 下载mysq5.7的安装包 http://dev.mysql.com/downloa ...

  6. H5页面在微信中禁止下拉露出网页

    H5页面在微信中禁止默认事件的执行,js添加代码 $(function () { /************微信h5页面禁止下拉露出网页来**************/ $('body').on('t ...

  7. 从es中拉取全部数据/大量数据 使用scroll+scan避免深分页

    es一次请求默认返回的数据条数是10条,可以通过设置size参数来控制返回数据的条数: 如果要返回很多数据,可以把size设置的很大,不过elastic search默认size最大不能超过1万. 那 ...

  8. scrapy 原理,结构,基本命令,item,spider,selector简述

    原理,结构,基本命令,item,spider,selector简述 原理 (1)结构 (2)运行流程 实操 (1) scrapy命令: 注意先把python安装目录的scripts文件夹添加到环境变量 ...

  9. windows下安装Composer提示缺少openssl的解决方法

    在Windows环境下安装Composer(注:Composer要求PHP版本在5.3.2+),你可能会遇到这种安装失败的情况:出错信息是 "The openssl extension is ...

  10. python 对象和类

    python中所有数据都是以对象形式存在.对象既包含数据(变量),也包含代码(函数),是某一类具体事物的特殊实例. 面向对象的三大特性为封装.继承和多态. 1.定义类 #定义空类 class Pers ...