大数据全系列 教程
1869个小节阅读:468k
目录
408考研
JAVA全系列 教程
面向对象的程序设计语言
Python全系列 教程
Python3.x版本,未来主流的版本
人工智能 教程
顺势而为,AI创新未来
大厂算法 教程
算法,程序员自我提升必经之路
C++ 教程
一门通用计算机编程语言
微服务 教程
目前业界流行的框架组合
web前端全系列 教程
通向WEB技术世界的钥匙
大数据全系列 教程
站在云端操控万千数据
AIGC全能工具班
A A
White Night
##6.4 代码实现
自定义数据类型Weather
包含时间:年 月 日
包含温度
定义内部类,实现自定义排序比较规则
自定义分组比较
年月相同被视为相同的key
那么reduce迭代时,相同年月的记录有可能是同一天的,reduce中需要判断是否同一天
数据量很大:
全量数据可以切分成最少按一个月份的数据量进行判断
这种业务场景可以设置多个reduce
通过实现partition
###6.4.1 key类Weather的设计
xxxxxxxxxx
package com.itbaizhan;
import org.apache.hadoop.io.WritableComparable;
import org.apache.hadoop.io.WritableComparator;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class Weather implements WritableComparable<Weather> {
//定义属性
private Integer year;
private Integer month;
private Integer day;
private Double temperature;
//该方法可以在排序比较器中调用,也可以在分组比较器中调用。
//但是排序比较和分组比较器逻辑是不同,所以只能满足其中一方调用。想被谁调用,就按照对应的逻辑编写
@Override
public int compareTo(Weather that) {
//逻辑按照排序比较器实现
int result = this.year.compareTo(that.getYear());
if(result==0){//年相同
result = this.month.compareTo(that.getMonth());
if(result==0){//表示月份相同
result = this.temperature.compareTo(that.getTemperature());
}
}
return result;
}
//通过内部类注册key自带比较器
public static class Comparator extends WritableComparator {
public Comparator() {
//修改为Weather.class
super(Weather.class);
}
@Override
public int compare(WritableComparable a, WritableComparable b) {
Weather wa = (Weather) a;
Weather wb = (Weather) b;
//如果Weather类中的compareTo方法的比较逻辑符合此处的逻辑的话,可以直接调用
return wa.compareTo(wb);
}
}
static {
// register this comparator
WritableComparator.define(Weather.class, new Weather.Comparator());
}
@Override
public void write(DataOutput out) throws IOException {
out.writeInt(year);
out.writeInt(month);
out.writeInt(day);
out.writeDouble(temperature);
}
@Override
public void readFields(DataInput in) throws IOException {
this.year = in.readInt();
this.month = in.readInt();
this.day = in.readInt();
this.temperature = in.readDouble();
}
@Override
public String toString() {
return "Weather{" +"year=" + year +", month=" + month
+", day=" + day +", temperature=" + temperature +'}';
}
public Integer getYear() {
return year;
}
public void setYear(Integer year) {
this.year = year;
}
public Integer getMonth() {
return month;
}
public void setMonth(Integer month) {
this.month = month;
}
public Integer getDay() {
return day;
}
public void setDay(Integer day) {
this.day = day;
}
public Double getTemperature() {
return temperature;
}
public void setTemperature(Double temperature) {
this.temperature = temperature;
}
}