B05 - 043、Mapreduce的排序初步

初学耗时:1h

注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

一、Mapreduce的排序初步
  1.1  需求。
  1.2  分析。
  1.3  实现(自定义Bean)。



记忆词:

  Mapreduce的排序初步

B05 - 999、大数据组件学习② - Hadoop


ギ 舒适区ゾ || ♂ 累觉无爱 ♀





一、Mapreduce的排序初步

  1.1 ~ 需求。
  • 在得出统计每一个用户(手机号)所耗费的总上行流量、下行流量、总流量结果的基础之上再加一个需求:将统计结果按照总流量倒序排序。
  1.2 ~ 分析。
  • 基本思路:实现自定义的 bean 来封装流量信息,并将 bean 作为 map 输出的 key 来传输 MR 程序在处理数据的过程中会对数据排序(map 输出的 kv 对传输到 reduce之前,会排序),排序的依据是 map 输出的 key。
  • 所以,我们如果要实现自己需要的排序规则,则可以考虑将排序因素放到 key 中,让 key 实现接口:WritableComparable,然后重写 key 的 compareTo 方法。
  1.3 ~ 实现(自定义Bean)。
public class FlowBean implements WritableComparable<FlowBean>{
	private long upFlow;
	private long downFlow;
	private long sumFlow;
	
	//这里反序列的时候会用到
	public FlowBean() {
	
	}
	
	public FlowBean(long upFlow, long downFlow, long sumFlow) {
		this.upFlow = upFlow;
		this.downFlow = downFlow;
		this.sumFlow = sumFlow;
	}
	
	public FlowBean(long upFlow, long downFlow) {
		this.upFlow = upFlow;
		this.downFlow = downFlow;
		this.sumFlow = upFlow+downFlow;
	}
	
	public void set(long upFlow, long downFlow) {
		this.upFlow = upFlow;
		this.downFlow = downFlow;
		this.sumFlow = upFlow+downFlow;
	}
	
	@Override
	public String toString() {
		return upFlow+"\t"+downFlow+"\t"+sumFlow;
	}
	
	//这里是序列化方法
	@Override
	public void write(DataOutput out) throws IOException {
		out.writeLong(upFlow);
		out.writeLong(downFlow);
		out.writeLong(sumFlow);
	}
	
	//这里是反序列化方法	
	@Override
	public void readFields(DataInput in) throws IOException {
	//注意反序列化的顺序跟序列化的顺序一致
	this.upFlow = in.readLong();
	this.downFlow = in.readLong();
	this.sumFlow = in.readLong();
	}
	
	//这里进行 bean 的自定义比较大小
	@Override
	public int compareTo(FlowBean o) {
		//实现按照 sumflow 的大小倒序排序
		return this.sumFlow>o.getSumFlow()?-1:1;
	}
}

public class FlowSumMapper extends Mapper<LongWritable, Text, Text, FlowBean>{
	Text k = new Text();
	FlowBean v = new FlowBean();
	
	@Override
	protected void map(LongWritable key, Text value,Context context)
	throws IOException, InterruptedException {
	
		String line = value.toString();
		String[] fields = line.split("\t");
		String phoneNum = fields[1];
		long upFlow = Long.parseLong(fields[fields.length-3]);
		long downFlow = Long.parseLong(fields[fields.length-2]);
		k.set(phoneNum);
		v.set(upFlow, downFlow);
		
		context.write(k, v);
	}
}

public class FlowSumReducer extends Reducer<Text, FlowBean, Text, FlowBean> {
	FlowBean v = new FlowBean();
	
	@Override
	protected void reduce(Text key, Iterable<FlowBean> values, Context context)
	throws IOException, InterruptedException {
		long upFlowCount = 0;
		long downFlowCount = 0;
		for (FlowBean bean : values) {
		upFlowCount += bean.getUpFlow();
		downFlowCount += bean.getDownFlow();
		}
	
		v.set(upFlowCount, downFlowCount);
		context.write(key, v);
	}
}


春花秋月何时了?往事知多少。

- - - - - - - - - - - - - - - - - - - - - - - - - - - -



^ 至此,Mapreduce的排序初步完成。


- - - - - - - - - - - - - - - - - - - - - - - - - - - -


※ 世间诱惑何其多,坚定始终不动摇。

众所周知我们所处的宇宙的质能公式是E=mc2 ,其中c是真空中的光速。和我们的宇宙平行的另一个宇宙meta,研究显示他们使用的质能公式是E=(2+√3) m ,当一个物体的质量很大的时候,对应的能量E非常大,数据也非常的长。但meta宇宙里面的智慧生物非常的懒,他们只愿意把E取整,然后记录对应的能量E的最后一位整数,比如m=0时,他们会记录1,m=1时,他们会记录3,m=2时,他们会记录3.现在请问当m=80时,他们会记录多少?


A、1
B、2
C、3
D、4
E、5
F、6

C
alt



春花秋月何时了?往事知多少。

- - - - - - - - - - - - - - - - - - - - - - - - - - - -


注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。

我知道我的不足,我也知道你的挑剔,但我就是我,不一样的烟火,谢谢你的指指点点,造就了我的点点滴滴:)!



春花秋月何时了?往事知多少。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值