环境
  虚拟机:VMware 10
  Linux版本:CentOS-6.5-x86_64
  客户端:Xshell4
  FTP:Xftp4
  jdk8
  hadoop-3.1.1

找出每个月气温最高的2天

1949-10-01 14:21:02        34c
1949-10-01 19:21:02 38c
1949-10-02 14:01:02 36c
1950-01-01 11:21:02 32c
1950-10-01 12:21:02 37c
1951-12-01 12:21:02 23c
1950-10-02 12:21:02 41c
1950-10-03 12:21:02 27c
1951-07-01 12:21:02 45c
1951-07-02 12:21:02 46c
1951-07-03 12:21:03 47c
package test.mr.tq;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; /**
* @author Administrator
* 客户端
*/
public class MyTQ { /**
* 找出每个月气温最高的2天 * @param args
*/
public static void main(String[] args) {
//加载配置文件
Configuration conf = new Configuration(); try {
//创建客户端
Job job = Job.getInstance(conf,"tian qi");
job.setJarByClass(MyTQ.class); //Map
job.setMapperClass(TQMapper.class);
job.setOutputKeyClass(TQ.class);
job.setOutputValueClass(IntWritable.class);
//分区类 处理大数据量均衡并发处理
job.setPartitionerClass(TqPartitioner.class);
//用于buffer字节数组内的key排序的比较类 温度最高的2天 需要排序
job.setSortComparatorClass(TqSortComparator.class); //Reduce
job.setReducerClass(TqReducer.class);
job.setNumReduceTasks(2);
//用于分组的比较类 年月相同的被视为一组
job.setGroupingComparatorClass(TqGroupingComparator.class); //输入 输出
Path input = new Path("/root/input");
FileInputFormat.addInputPath(job, input);
Path output = new Path("/root/output");
if (output.getFileSystem(conf).exists(output))
{
output.getFileSystem(conf).delete(output, true);
}
FileOutputFormat.setOutputPath(job, output); //提交
System.exit(job.waitForCompletion(true) ? 0 : 1); } catch (Exception e) {
e.printStackTrace();
} } }
package test.mr.tq;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; import org.apache.hadoop.io.WritableComparable; public class TQ implements WritableComparable<TQ>{ private int year;
private int month;
private int day;
private int wd;
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
public int getMonth() {
return month;
}
public void setMonth(int month) {
this.month = month;
}
public int getDay() {
return day;
}
public void setDay(int day) {
this.day = day;
}
public int getWd() {
return wd;
}
public void setWd(int wd) {
this.wd = wd;
} /**
* 反序列化进来
*/
@Override
public void readFields(DataInput in) throws IOException {
this.year = in.readInt();
this.month = in.readInt();
this.day = in.readInt();
this.wd = in.readInt();
} /**
* 序列化出去
*/
@Override
public void write(DataOutput out) throws IOException {
out.writeInt(year);
out.writeInt(month);
out.writeInt(day);
out.writeInt(wd);
} @Override
public int compareTo(TQ that) {
//时间正序
int y = Integer.compare(this.year, that.getYear());
if (y == 0)
{
int m = Integer.compare(this.month, that.getMonth());
if (m == 0)
{
return Integer.compare(this.day, that.getDay());
}
return m;
}
return y;
} }
package test.mr.tq;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class TqGroupingComparator extends WritableComparator { public TqGroupingComparator()
{
super(TQ.class,true);
} /**
* 面向reduce 按照年月分组
* 年月不相同 就不属于同一组
* 返回0表示同一组
*/
@Override
public int compare(WritableComparable a, WritableComparable b) {
TQ t1 = (TQ)a;
TQ t2 = (TQ)b;
int y = Integer.compare(t1.getYear(), t2.getYear());
if (y==0)
{
return Integer.compare(t1.getMonth(), t2.getMonth());
}
return y;
}
}
package test.mr.tq;

import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; import org.apache.commons.lang.StringUtils;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Mapper; public class TQMapper extends Mapper<LongWritable, Text, TQ, IntWritable> {
//k:v映射的设计
// K V
// 1949-10-01 14:21:02 34c
// 1949-10-01 19:21:02 38c
// 1949-10-02 14:01:02 36c
// 1950-01-01 11:21:02 32c
// 1950-10-01 12:21:02 37c
// 1951-12-01 12:21:02 23c
// 1950-10-02 12:21:02 41c
// 1950-10-03 12:21:02 27c
// 1951-07-01 12:21:02 45c
// 1951-07-02 12:21:02 46c
// 1951-07-03 12:21:03 47c TQ tq = new TQ();
IntWritable vwd = new IntWritable(); @Override
protected void map(LongWritable key, Text value,
Context context) throws IOException, InterruptedException
{
try
{
//1951-07-03 12:21:03 47c
String[] strs = StringUtils.split(value.toString(),"\t");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date date = sdf.parse(strs[0]); Calendar cal = Calendar.getInstance();
cal.setTime(date); //key
tq.setYear(cal.get(Calendar.YEAR));
tq.setMonth(cal.get(Calendar.MONTH)+1);
tq.setDay(cal.get(Calendar.DAY_OF_MONTH));
int wd = Integer.parseInt(strs[1].substring(0, strs[1].length()-1));
tq.setWd(wd); //value
vwd.set(wd); //输出
context.write(tq, vwd);
}
catch (ParseException e)
{
e.printStackTrace();
} } }
package test.mr.tq;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner; /**
* @author wjy
* K.V==>K.V.P
* 分区规则设计 尽量使数据分区均衡 避免倾斜
*/
public class TqPartitioner extends Partitioner<TQ, IntWritable> { @Override
public int getPartition(TQ key, IntWritable value, int numPartitions) { return key.getYear() % numPartitions;
} }
package test.mr.tq;

import java.io.IOException;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; public class TqReducer extends Reducer<TQ, IntWritable, Text, IntWritable> { Text rkey = new Text();
IntWritable rval = new IntWritable(); @Override
protected void reduce(TQ key, Iterable<IntWritable> values, Context context)
throws IOException, InterruptedException
{
//相同的key为一组
// 时间正序 温度倒序
// 1970 01 01 40
// 1970 01 02 38
//迭代values key会随着变化
int flg = 0;
int day = 0;
for (IntWritable wd : values) {
if (flg == 0)
{
day = key.getDay();
rkey.set(key.getYear()+"-"+key.getMonth()+"-"+key.getDay());
rval.set(key.getWd());//wd.get()
context.write(rkey, rval);
flg ++;
} if (flg != 0 && day != key.getDay())
{
rkey.set(key.getYear()+"-"+key.getMonth()+"-"+key.getDay());
rval.set(key.getWd());//wd.get()
context.write(rkey, rval);
break;
}
}
}
}
package test.mr.tq;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class TqSortComparator extends WritableComparator { //对字节数据中map进行排序 所以需要先将Key反序列化为对象 然后再进行比较
public TqSortComparator()
{
super(TQ.class,true);
} /**
* 按照时间正序 温度倒序对字节数组排序
*/
@Override
public int compare(WritableComparable a, WritableComparable b) {
TQ t1 = (TQ)a;
TQ t2 = (TQ)b;
int y = Integer.compare(t1.getYear(), t2.getYear());
if (y==0)
{
int m = Integer.compare(t1.getMonth(), t2.getMonth());
if (m == 0)
{
//前面加一个负号 就可以实现倒序的效果
return - Integer.compare(t1.getWd(), t2.getWd());
}
return m;
}
return y;
} }

【Hadoop学习之九】MapReduce案例分析一-天气的更多相关文章

  1. 【Hadoop学习之十二】MapReduce案例分析四-TF-IDF

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 概念TF-IDF(term fre ...

  2. 【Hadoop学习之十三】MapReduce案例分析五-ItemCF

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 推荐系统——协同过滤(Collab ...

  3. 【Hadoop学习之十】MapReduce案例分析二-好友推荐

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 最应该推荐的好友TopN,如何排名 ...

  4. 【Hadoop学习之十一】MapReduce案例分析三-PageRank

    环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 FTP:Xftp4 jdk8 hadoop-3.1.1 什么是pagerank?算法原理- ...

  5. Hadoop学习笔记—20.网站日志分析项目案例(一)项目介绍

    网站日志分析项目案例(一)项目介绍:当前页面 网站日志分析项目案例(二)数据清洗:http://www.cnblogs.com/edisonchou/p/4458219.html 网站日志分析项目案例 ...

  6. Hadoop学习笔记—20.网站日志分析项目案例(二)数据清洗

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:当前页面 网站日志分析项目案例 ...

  7. Hadoop学习笔记—20.网站日志分析项目案例

    1.1 项目来源 本次要实践的数据日志来源于国内某技术学习论坛,该论坛由某培训机构主办,汇聚了众多技术学习者,每天都有人发帖.回帖,如图1所示. 图1 项目来源网站-技术学习论坛 本次实践的目的就在于 ...

  8. Hadoop学习笔记—20.网站日志分析项目案例(三)统计分析

    网站日志分析项目案例(一)项目介绍:http://www.cnblogs.com/edisonchou/p/4449082.html 网站日志分析项目案例(二)数据清洗:http://www.cnbl ...

  9. Hadoop学习笔记—12.MapReduce中的常见算法

    一.MapReduce中有哪些常见算法 (1)经典之王:单词计数 这个是MapReduce的经典案例,经典的不能再经典了! (2)数据去重 "数据去重"主要是为了掌握和利用并行化思 ...

随机推荐

  1. 机器学习:K-近邻算法

    K-近邻算法 优点:精度高.对异常值不敏感.无数据输入假定.缺点:计算复杂度高.空间复杂度高.使用数据范围:数值型和标称型. k-近邻算法的一般流程 搜集数据:可以使用任何方法.准备数据:距离计算所需 ...

  2. Docker 架构(四)

    Docker 使用客户端-服务器 (C/S) 架构模式,使用远程 API 来管理和创建 Docker 容器. Docker 容器通过 Docker 镜像来创建. 容器与镜像的关系类似于面向对象编程中的 ...

  3. Vue 通过 Lodash 限制操作频率

    <template> <div id="watch-example"> <p> Ask a yes/no question: <input ...

  4. NPM常用命令install 淘宝镜像 update等

    NPM是随同NodeJS一起安装的包管理工具,允许用户从NPM服务器上传下载安装第三方包或命令行程序,能解决NodeJS代码部署上的很多问题,非常方便.下面我们一起来看看常用的npm命令有哪些 使用方 ...

  5. 【UNIX网络编程(三)】TCP客户/server程序演示样例

    上一节给出了TCP网络编程的函数.这一节使用那些基本函数编写一个完毕的TCP客户/server程序演示样例. 该样例运行的过程例如以下: 1.客户从标准输入读入一行文本,并写给server. 2.se ...

  6. Vue-selller 饿了吗 - 准备工作

    安装脚手架vue-cli npm install -g vue-cli 建立项目 vue init webpack sell(sell是项目名称) 进入项目目录 cd sell 可以看目录结构: ls ...

  7. DLNg序列模型第二周NLP与词嵌入

    1.使用词嵌入 给了一个命名实体识别的例子,如果两句分别是“orange farmer”和“apple farmer”,由于两种都是比较常见的,那么可以判断主语为人名. 但是如果是榴莲种植员可能就无法 ...

  8. InstallShield12的安装破解方法

    InstallShield是一个非常专业的windows程序打包工具,利用它我们可以轻松方便地将我们开发的windows程序进行封装打包.下面呢我就以我自己的实际操作经历来给大家介绍一下如何安装和破解 ...

  9. 查看手机cpu信息

    adb shell getprop ro.product.cpu.abi

  10. 一个vue的循环列表,里面的按钮的移入事件

    需求:移入的时候,互相关注变成取消关注 移入移出事件传参$event,把这个参数打印出来看就可以搞定,而不是移入的时候,文本都改变,只改变当前行 的文本 <p @mouseover=" ...