实验六 MapReduce数据清洗-气象数据清洗
第1关:数据清洗
任务描述
本关任务:对数据按照一定规则进行清洗。
编程要求
根据提示,在右侧编辑器补充代码,对数据按照一定规则进行清洗。
数据说明如下: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
测试说明
平台会对你编写的代码进行测试:
评测之前先在命令行启动hadoop:start-all.sh;
Weather:封装对象;
WeatherMap:map端操作;
WeatherReduce:reduce端操作;
Auto:自定义分区;
WeatherTest:测试结果类。
具体本关的预期输出请查看右侧测试集。
因为大数据实训消耗资源较大,且map/reduce运行比较耗时,所以评测时间较长,大概在60秒左右,请耐心等待。
开始你的任务吧,祝你成功!
代码实现
命令行
start-all.sh
代码文件
step1/com/Weather.java
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.year = year;
}
public String