根据提示,在右侧编辑器补充代码,对数据按照一定规则进行清洗。
数据说明如下:a.txt
;
数据切分方式:一个或多个空格
;
数据所在位置:/user/test/input/a.txt
;
2005 01 01 16 -6 -28 10157 260 31 8 0 -9999
2005 | 01 | 01 | 16 | -6 | -28 | 10157 | 260 | 31 | 8 | 0 | -9999 |
---|---|---|---|---|---|---|---|---|---|---|---|
年 | 月 | 日 | 小时 | 温度 | 湿度 | 气压 | 风向 | 风速 | 天气情况 | 1h降雨量 | 6h降雨量 |
sky.txt
;
数据切分方式:逗号
;
数据所在位置:data/sky.txt
或者/user/test/input/sky.txt
。
1,积云
1 | 积云 |
---|---|
天气情况 | cumulus |
清洗规则:
- 将分隔符转化为逗号;
- 清除不合法数据:字段长度不足,风向不在
[0,360]
的,风速为负的,气压为负的,天气情况不在[0,10]
,湿度不在[0,100]
,温度不在[-40,50]
的数据; - 将
a.txt
与sky.txt
的数据以天气情况进行join
操作,把天气情况变为其对应的云属; - 对进入同一个分区的数据排序; 排序规则: (1)同年同月同天为
key
; (2)按每日温度升序; (3)若温度相同则按风速升序; (4)风速相同则按压强降序。 - 设置数据来源文件路径及清洗后的数据存储路径: 数据来源路径为:
/user/test/input/a.txt (HDFS)
; 清洗后的数据存放于:/user/test/output (HDFS)
。
数据清洗后如下:
2005,01,01,16,-6,-28,10157,260,31,卷云,0,-9999
Weather类代码:
package com;
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
/**封装对象*/
public class Weather implements WritableComparable<Weather> {
//年
private String year;
//月
private String month;
//日
private String day;
//小时
private String hour;
//温度
private int temperature;
//湿度
private String dew;
//气压/压强
private int pressure;
//风向
private String wind_direction;
//风速
private int wind_speed;
//天气情况
private String sky_condition;
//1小时降雨量
private String rain_1h;
//6小时降雨量
private String rain_6h;
public String getYear() {
return year;
}
public void setYear(String year) {
this.y