MapReduce---天气数据清洗

数据及需求

数据


数据一
在这里插入图片描述
字段解释:年,月,日,小时,温度,湿度,气压,风向,风速,天气情况,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,天气状况


需求及实现


需求

  1. 将分割符由一个或多个空格转换成逗号
  2. 清除不合法数据:字段长度不足,风向不在[0,360]的,风速为负的,气压为负的,天气情况不在[0,10],湿度不在[0,100],温度不在[-40,50]的数据
  3. 将数据一与数据二的数据以天气情况进行join操作,把天气情况变为其对应的云属;
  4. 对进入同一个分区的数据排序; 排序规则: (1)同年同月同天为key; (2)按每日温度升序; (3)若温度相同则按风速升序; (4)风速相同则按压强降序

解析

  1. 需求一的解决方法:链接: 链接.
  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()
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值