Hadoop之航班延误比例(GroupBy)

一、前言
离上一次写博客还是2年前了,这次借着上大数据的课有回到写博客的日常了,一是可以让自己在写博客的时候更深层次的理解所要写的东西,二来也可以帮助一些有需要的人,同时我们可以共同探讨这些知识。
二、描述
在生活中,飞机这个交通工具我们一定不陌生,它不仅给我们带来了极大地方便,而且也给我们很多启示。那这次我们说说航班吧,有这样一道题:根据航班信息,利用MapReduce处理大量航班信息来获得每月航班总数量、航班准时到达比例、航班延迟到达比例、航班准时起飞比例、航班起飞延迟比例以及航班取消比例。
三、数据采集
我们这使用的是某航空公司的数据集,包括了该公司从1987年到2008年美国国内航班目的地和起飞的航班信息。这个数据集大约有120万条记录,记录中的字段由逗号分隔(CSV).非压缩格式下该数据集大小为120GB。这是个很大的数据集,适合Hadoop进行处理,但是也没有庞大到难以处理。当然也借着这些数据集来理解在结构化的数据处理的背景下的MapReduce。当然这次使用1987年和1988年的数据便足够了。(数据集下载)
以下是航空数据集的数据字典
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
四、准备工作
(1).开发环境

Ubuntu18.10
Intellij IDEA 2018.3.5
Hadoop 3.2.0
Maven

(2).数据选择

为选择简化开发工作,选择其中两年来进行操作(以1987年和1988年为例),当然如果想更好的利用Hadoop可以使用全部数据,这个前提当然是你的电脑性能够好。

(3).准备Hadoop系统

我们需要将航班数据放到Hadoop分布式文件系统(Hadoop Distributed File System ,HDFS)中。首先需要开启本地安装的Hadoop(在终端输入start-all.sh指令),再在该分布式下创建存放输入输出文件的文件夹,具体操作如下:
在这里插入图片描述
同样的操作可以创建二级、三级文件夹。至于将数据文件放到Hadoop分布系统,有这样一个思路,可以先在主目录下创建文件,或者本来就存在这需要的数据文件或压缩包,然后利用指令put到该分布式系统上,以该次程序为例:
在这里插入图片描述
通过以上操作,数据集便准备完毕。

五、分析
对于这个题,你可能首先会感觉,如果这是数学题该多好。竟然说到数学,那我们就用数学的思维来分析分析这道题。题目是要获得航班准时到达比例、航班延迟到达比例、航班准时起飞比例、航班起飞延迟比例以及航班取消比例,那我们可以先分别求出各个情况的总数,然后再求出总的航班数,两者一比较就获得我们想要的数据。
对于MapReduce思维,我们首先根据Map来读取文件记录处理记录,再根据Reduce来统计各种情况
这里以到达延迟为例:

在这里插入图片描述

六、源码
工具类
AggregationMapper类之Map

public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
       if(!AirlineDataUtils.isHeader(value)){
                String[] contents = value.toString().split(",");
                String month = AirlineDataUtils.getMonth(contents);
                int arrivalDelay = AirlineDataUtils.parseMinutes(AirlineDataUtils.getArrivalDelay(contents),0);
                int departureDelay = AirlineDataUtils.parseMinutes(AirlineDataUtils.getDepartureDelay(contents),0);
                boolean isCancelled =  AirlineDataUtils.parseBoolean(AirlineDataUtils.getCancelled(contents),false);
                boolean isDiverted =  AirlineDataUtils.parseBoolean(AirlineDataUtils.getDiverted(contents),false);
                context.write(new Text(month), RECORD);
                if(arrivalDelay>0){
                    context.write(new Text(month), ARRIVAL_DELAY);
                }
                else{
                    context.write(new Text(month), ARRIVAL_ON_TIME);
                }
                if(departureDelay>0){
                    context.write(new Text(month), DEPARTURE_DELAY);
                }
                else{
                    context.write(new Text(month), DEPARTURE_ON_TIME);
                }
                if(isCancelled){
                    context.write(new Text(month), IS_CANCELLED);
                }
                if(isDiverted){
                    context.write(new Text(month), IS_DIVERTED);
                }
            }

AggregationMapper类之Reduce

public  static class AggregationReducer extends Reducer<Text, IntWritable, NullWritable, Text> {
        public void reduce(Text key, Iterable<IntWritable> values, Context context)
                throws IOException, InterruptedException {
            double totalRecords = 0;
            double arrivalOnTime = 0;
            double arrivalDelays = 0;
            double departureOnTime = 0;
            double departureDelays = 0;
            double cancellations = 0;
            double diversions = 0;
            for(IntWritable v:values){
                if(v.equals(RECORD)){
                    totalRecords++;
                }
                if(v.equals(ARRIVAL_ON_TIME)){
                    arrivalOnTime++;
                }
                if(v.equals(ARRIVAL_DELAY)){
                    arrivalDelays++;
                }
                if(v.equals(DEPARTURE_ON_TIME)){
                    departureOnTime++;
                }
                if(v.equals(DEPARTURE_DELAY)){
                    departureDelays++;
                }
                if(v.equals(IS_CANCELLED)){
                    cancellations++;
                }
                if(v.equals(IS_DIVERTED)){
                    diversions++;
                }
            }  DecimalFormat df = new DecimalFormat( "0.0000" );
            StringBuilder output = new StringBuilder(key.toString());
            output.append(",").append(totalRecords);
            output.append(",").append(df.format(arrivalOnTime/totalRecords));
            output.append(",").append(df.format(arrivalDelays/totalRecords));
            output.append(",").append(df.format(departureOnTime/totalRecords));
            output.append(",").append(df.format(departureDelays/totalRecords));
            output.append(",").append(df.format(cancellations/totalRecords));
            output.append(",").append(df.format(diversions/totalRecords));
            context.write(NullWritable.get(), new Text(output.toString()));
        }
    }

七、运行程序
对于如何在IDEA上创建maven程序和如何运行Hadoop程序我就不过多赘述,请参考以下博客
Idea配置Maven搭建并运行简单的Hadoop-WordCount程序
程序源码在我github上,欢迎关注github
八、终端运行
首先要找到利用IDEA打包的jar包,在该目录下打开终端输入以下格式:Hadoop jar (jar包名称) (包名.类名) (输入文件路径) (输出文件目录)。
在这里插入图片描述
九、运行结果
在这里插入图片描述
就写到这吧,你们可以持续关注我的。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值