初学耗时:1h
注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。
一、Mapreduce的排序初步
1.1 需求。
1.2 分析。
1.3 实现(自定义Bean)。
记忆词:
Mapreduce的排序初步
一、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
- - - - - - - - - - - - - - - - - - - - - - - - - - - -
注:CSDN手机端暂不支持章节内链跳转,但外链可用,更好体验还请上电脑端。
我知道我的不足,我也知道你的挑剔,但我就是我,不一样的烟火,谢谢你的指指点点,造就了我的点点滴滴:)!