1.MyTopN  主程序

package com.littlepage.topn;

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.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser; import java.io.IOException; public class MyTopN {
public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException {
Configuration conf=new Configuration(true);
String[] other=new GenericOptionsParser(conf,args).getRemainingArgs();
//设定本地环境运行,不进行集群运行
conf.set("mapreduce.framework.name","local");
//设定异构平台
conf.set("mapreduce.app-submission.cross-platform","true");
Job job=Job.getInstance(conf);
job.setJarByClass(MyTopN.class);
job.setJobName("TopN");
//核心
//map task
//input,output
TextInputFormat.addInputPath(job,new Path(other[]));
Path outPath=new Path(other[]);
if(outPath.getFileSystem(conf).exists(outPath)){
outPath.getFileSystem(conf).delete(outPath,true);
}
//map
job.setMapperClass(TopNMapper.class);
job.setMapOutputKeyClass(TopNKey.class);
job.setMapOutputValueClass(IntWritable.class);
//partitioner
//只需要满足相同的key获得相同的分区号
job.setPartitionerClass(TopNPartitioner.class);
//sortComparator
job.setSortComparatorClass(TopNSortComparator.class);
//combine //reducetask
job.setReducerClass(TopNReducer.class);
//groupingComparator
job.setGroupingComparatorClass(TopNGroupingComparator.class);
//output
TextOutputFormat.setOutputPath(job,outPath);
job.waitForCompletion(true);
}
}

2.TopNKey

package com.littlepage.topn;

import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException; /**
* 自定义类型必须实现接口:
* 序列化/反序列化 比较器
*/ public class TopNKey implements WritableComparable<TopNKey> { private int year;
private int month;
private int day;
private int template; 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 getTemplate() {
return template;
} public void setTemplate(int template) {
this.template = template;
} @Override
public void write(DataOutput out) throws IOException {
out.writeInt(year);
out.writeInt(month);
out.writeInt(day);
out.writeInt(template);
} @Override
public void readFields(DataInput in) throws IOException {
this.year = in.readInt();
this.month = in.readInt();
this.day = in.readInt();
this.template = in.readInt();
} @Override
public int compareTo(TopNKey that) {
int c1 = Integer.compare(this.year,that.getYear());
if(c1==){
int c2 = Integer.compare(this.month,that.getMonth());
if(c2 == ){
return Integer.compare(this.day,that.getDay());
}
return c2;
}
return c1;
}
}

3.TopNMapper

package com.littlepage.topn;

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 org.apache.hadoop.util.StringUtils; import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date; public class TopNMapper extends Mapper<LongWritable, Text,TopNKey, IntWritable> {
TopNKey topNKey = new TopNKey();
IntWritable intWritable = new IntWritable(); @Override
protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
//开发习惯
//value: 2019-6-1 22:22:22 1 31
String[] strs = StringUtils.split(value.toString(), '\t');
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try{
Date date = sdf.parse(strs[]);
Calendar cal=Calendar.getInstance();
cal.setTime(date);
topNKey.setYear(cal.get(Calendar.YEAR));
topNKey.setMonth(cal.get(Calendar.MONTH)+);
topNKey.setDay(cal.get(Calendar.DAY_OF_MONTH));
int template=Integer.parseInt(strs[]);
topNKey.setTemplate(template);
intWritable.set(template);
context.write(topNKey,intWritable);
}catch (ParseException e){
e.printStackTrace();
}
}
}

4.TopNReducer

package com.littlepage.topn;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Reducer; import java.io.IOException;
import java.util.Iterator; public class TopNReducer extends Reducer<TopNKey, IntWritable, Text,IntWritable> {
Text rkey=new Text();
IntWritable rval=new IntWritable();
int flag=;
int day=;
@Override
protected void reduce(TopNKey key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
Iterator<IntWritable> iter = values.iterator();
while(iter.hasNext()){
IntWritable val=iter.next();
if(flag==){
rkey.set(key.getYear()+"-"+key.getMonth()+"-"+key.getDay());
rval.set(key.getTemplate());
context.write(rkey,rval);
flag++;
day=key.getDay();
}
if(flag!=&&day!=key.getDay()){
rkey.set(key.getYear()+"-"+key.getMonth()+"-"+key.getDay());
rval.set(key.getTemplate());
context.write(rkey,rval);
break;
}
}
}
}

5.TopNPartitioner 分区规划,来划分Map之后的结果是存在哪个dn进行处理

package com.littlepage.topn;

import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.mapreduce.Partitioner; public class TopNPartitioner extends Partitioner<TopNKey,IntWritable> {
@Override
public int getPartition(TopNKey key, IntWritable value, int numPartitions) {
//1.不能太复杂
//2.缩小组的维度
return key.getYear()%numPartitions;//可能会产生数据倾斜
}

}

6.TopNSortComparator 排序比较器,在Map中精确到月,按温度递减

package com.littlepage.topn;

import org.apache.hadoop.io.RawComparator;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class TopNSortComparator extends WritableComparator {
public TopNSortComparator(){
super(TopNKey.class,true);
} @Override
public int compare(WritableComparable a, WritableComparable b) {
TopNKey k1=(TopNKey) a;
TopNKey k2=(TopNKey) b;
//年,月,温度,且温度倒序
int c1=Integer.compare(k1.getYear(),k2.getYear());
if(c1==){
int c2=Integer.compare(k1.getMonth(),k2.getMonth());
if(c2==){
return -Integer.compare(k1.getTemplate(),k2.getTemplate());
}
return c2;
}
return c1;
}
}

7.TopNGroupingComparator 分组比较器,用于reduce的分组,每一个组是年月,进行reduce操作

package com.littlepage.topn;

import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator; public class TopNGroupingComparator extends WritableComparator {
public TopNGroupingComparator() {
super(TopNKey.class, true);
} @Override
public int compare(WritableComparable a, WritableComparable b) {
TopNKey k1 = (TopNKey) a;
TopNKey k2 = (TopNKey) b;
//年,月
int c1 = Integer.compare(k1.getYear(), k2.getYear());
if (c1 == ) {
return Integer.compare(k1.getMonth(), k2.getMonth());
}
return c1;
}
}

TopN案例是MapReduce的典型案例,需牢记

MapReduce TopN(自主复习)的更多相关文章

  1. MapReduce计数程序(自主复习)

    1.MyWordCount类 注意: 1.本机+测试,两个注释都放开 2.本机跑集群,要开异构平台为true 3.集群跑,把两个注释都注起来,然后在集群上面跑 package com.littlepa ...

  2. Before NOIP 2018

    目录 总结 刷题 2018 - 9 - 24 2018 - 9 - 25 2018 - 9 - 26 2018 - 9 - 27 2018 - 9 - 28 2018 - 9 - 29 2018 - ...

  3. C高级第一次PTA作业 要求三

    要求一.要求二 内容链接:http://www.cnblogs.com/X-JY/p/8550457.html 一.PTA作业中的知识点总结 1.6-1 计算两数的和与差(10 分) (1)*在程序中 ...

  4. mapreduce的cleanUp和setUp的特殊用法(TopN问题)和常规用法

    一:特殊用法 我们上来不讲普通用法,普通用法放到最后.我们来谈一谈特殊用法,了解这一用法,让你的mapreduce编程能力提高一个档次,毫不夸张!!!扯淡了,让我们进入正题: 我们知道reduce和m ...

  5. Hadoop基础-Map端链式编程之MapReduce统计TopN示例

    Hadoop基础-Map端链式编程之MapReduce统计TopN示例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.项目需求 对“temp.txt”中的数据进行分析,统计出各 ...

  6. Hadoop学习之路(二十)MapReduce求TopN

    前言 在Hadoop中,排序是MapReduce的灵魂,MapTask和ReduceTask均会对数据按Key排序,这个操作是MR框架的默认行为,不管你的业务逻辑上是否需要这一操作. 技术点 MapR ...

  7. 大数据学习——mapreduce学习topN问题

    求每一个订单中成交金额最大的那一笔  top1 数据 Order_0000001,Pdt_01,222.8 Order_0000001,Pdt_05,25.8 Order_0000002,Pdt_05 ...

  8. 大数据mapreduce全局排序top-N之python实现

    a.txt.b.txt文件如下: a.txt hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop hadoop ...

  9. hadoop mapreduce求解有序TopN(高效模式)

    1.在map阶段对数据先求解改分片的topN,到reduce阶段再合并求解一次,求解过程利用TreeMap的排序特性,不用自己写算法. 2.样板数据,类似如下 1 13682846555 192.16 ...

随机推荐

  1. Edge Detection

      Edge Detection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 22604   Accepted: 5311 ...

  2. RF-创建一个自定义关键字库

    仓库自定义库 这里以Selenium2Library库进行举例说明: 编写一个自定义仓库类(与库文件夹名一致),继承关键字类,指定范围和版本即可. 需要声明__init__. import os fr ...

  3. Http常见的响应头

    Location: http://www.it315.org/index.jsp   -表示重定向的地址,该头和302的状态码一起使用. Server:apache tomcat            ...

  4. pip安装selenium时,报错“You are using pip version 10.0.1, however version 18.0 is available.”的问题

    pip安装selenium,pip install selenium 类型这样错误 1  原因可能不是以管理员身份运行cmd安装selenium 2  解决方式 也是要管理员身份运行 重点在最后一句 ...

  5. linux(centOS7)的基本操作(三) 用户、组、权限管理

    用户和组 1.用户.组.家目录的概念 linux系统支持多用户,除了管理员,其他用户一般不应该使用root,而是应该向管理员申请一个账号.组类似于角色,系统可以通过组对有共性的用户进行统一管理.每个用 ...

  6. github创建项目,并提交本地文件

    1.如图所示,不要点选"Initialize this repository with README",不然就看不到第二幅图的提示信息了 2.根据下面提示,初始化本地文件,然后上传

  7. Spring Boot 自定义注册 Servlet、Filter、Listener

    前言 在 Spring Boot 中已经移除了 web.xml 文件,如果需要注册添加 Servlet.Filter.Listener 为 Spring Bean,在 Spring Boot 中有两种 ...

  8. mac打开已损坏或者不明来源的应用的解决方法

    如遇:「xxx.app已损坏,打不开.你应该将它移到废纸篓」,并非你安装的软件已损坏,而是Mac系统的安全设置问题,因为这些应用都是破解或者汉化的,那么解决方法就是临时改变Mac系统安全设置.出现这个 ...

  9. LeetCode.965-单一二叉树(Univalued Binary Tree)

    这是悦乐书的第366次更新,第394篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第228题(顺位题号是965).如果树中的每个节点具有相同的值,则二叉树是单一的.当且仅 ...

  10. 【数字图像处理】Bilateral Filters

    [数字图像处理]Bilateral Filters https://www.yuque.com/lart/idh721/bf 简单介绍 双边滤波是一种非线性的可以模糊图像并且能保留一定的边缘信息的技术 ...