数据及需求
数据
数据一
字段解释:年,月,日,小时,温度,湿度,气压,风向,风速,天气情况,1h降雨量,6h降雨量
数据二
0,cloudless
1,cumulus
2,cumulonimbus
3,stratocumulus
4,stratus
5,nimbostratus
6,altostratus
7,altocumulus
8,Cirrus
9,stratocirrus
10,cirrocumulus
字段解释:id,天气状况
需求及实现
需求
- 将分割符由一个或多个空格转换成逗号
- 清除不合法数据:字段长度不足,风向不在[0,360]的,风速为负的,气压为负的,天气情况不在[0,10],湿度不在[0,100],温度不在[-40,50]的数据
- 将数据一与数据二的数据以天气情况进行join操作,把天气情况变为其对应的云属;
- 对进入同一个分区的数据排序; 排序规则: (1)同年同月同天为key; (2)按每日温度升序; (3)若温度相同则按风速升序; (4)风速相同则按压强降序
解析
- 需求一的解决方法:链接: 链接.
- 需求二就是判断语句
- 需求三将数据二缓存到内存里面
- 需求四在自定义类的时候,定义排序规则,然后自定义分组
代码实现
自定义的类
import org.apache.hadoop.io.WritableComparable;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
public class Data implements WritableComparable<Data> {
//年
private String year;
//月
private String month;
//日
private String day;
//小时
private String hour;
//温度
private String temperature;
//湿度
private String dew;
//气压/压强
private int pressure;
//风向
private String wind_direction;
//风速
private String wind_speed;
//天气情况
private String sky_condition;
//1小时降雨量
private String rain_1h;
//6小时降雨量
private String rain_6h;
@Override
public int compareTo(Data o) {
int a = (this.temperature.compareTo(o.temperature));
int b = (this.wind_speed.compareTo(o.wind_speed));
if (a == 0) {
if (b == 0) {
return o.pressure - this.pressure;
}
return b;
}
return a;
}
@Override
public void write(DataOutput dataOutput) throws IOException {
dataOutput.writeUTF(year);
dataOutput.writeUTF(month);
dataOutput.writeUTF(day);
dataOutput.writeUTF(hour);
dataOutput.writeUTF(temperature);
dataOutput.writeUTF(dew);
dataOutput.writeInt(pressure);
dataOutput.writeUTF(wind_direction);
dataOutput.writeUTF(wind_speed);
dataOutput.writeUTF(sky_condition);
dataOutput.writeUTF(rain_1h);
dataOutput.writeUTF(rain_6h);
}
@Override
public void readFields(DataInput dataInput) throws IOException {
year = dataInput.readUTF();
month = dataInput.readUTF();
day = dataInput.readUTF();
hour = dataInput.readUTF();
temperature = dataInput.readUTF();
dew = dataInput.readUTF()