Hadoop第五章:几个案例

系列文章目录

Hadoop第一章:环境搭建
Hadoop第二章:集群搭建(上)
Hadoop第二章:集群搭建(中)
Hadoop第二章:集群搭建(下)
Hadoop第三章:Shell命令
Hadoop第四章:Client客户端
Hadoop第四章:Client客户端2.0
Hadoop第五章:词频统计
Hadoop第五章:序列化
Hadoop第五章:几个案例



前言

这次博客记录一些hadoop中的简单案例。


一、Partition分区案例

其实前面还有一大段的理论知识,但是博主能力有限,只能记录一下这些实操案例。

1.需求分析

在这里插入图片描述

2.代码编写

简单说一下,这个partitioner分区的实现是在整个流程中的map之后reducer之前。
新建一个包partitioner,并将之前writable的文件整体复制过来。然后新建一个provincepartitioner。
在这里插入图片描述

package com.atguigu.mapreduce.partitioner;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

public class ProvincePartitioner extends Partitioner<Text, FlowBean> {
    @Override
    public int getPartition(Text text, FlowBean flowBean, int i) {
        String phone = text.toString();

        String prePhone = phone.substring(0, 3);

        int partition;

        if ("136".equals(prePhone)) {
            partition = 0;
        } else if ("137".equals(prePhone)) {
            partition = 1;
        } else if ("138".equals(prePhone)) {
            partition = 2;
        } else if ("139".equals(prePhone)) {
            partition = 3;
        } else {
            partition = 4;
        }
        return partition;
    }
}

现在我们通过driver将这个分区加入到hadoop流程中
在这里插入图片描述
在这个位置添加两行代码。

//指定自定义分区器
job.setPartitionerClass(ProvincePartitioner.class);
//同时指定相应数量的ReduceTask
job.setNumReduceTasks(5);

然后简单修改一下输出路径就可以了。

3.执行结果

在这里插入图片描述
现在执行结果已经被分成了五个文件。随便看一下。
在这里插入图片描述
0号码文件都是136开头的。
在这里插入图片描述
1号文件是137的。
剩下的不看了。

二、writableComparable排序(全排序)

1.需求分析

在这里插入图片描述

2.代码编写

创建一个writableComparable,并将之前的代码复制过来。
在这里插入图片描述
FlowBean编写

package com.atguigu.mapreduce.writable;

import org.apache.hadoop.io.Writable;
import org.apache.hadoop.io.WritableComparable;

import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;

public class FlowBean implements WritableComparable<FlowBean> {
    private long upFlow;
    private long downFlow;
    private long sumFlow;


    public FlowBean() {
    }

    public long getUpFlow() {
        return upFlow;
    }

    public void setUpFlow(long upFlow) {
        this.upFlow = upFlow;
    }

    public long getDownFlow() {
        return downFlow;
    }

    public void setDownFlow(long downFlow) {
        this.downFlow = downFlow;
    }

    public long getSumFlow() {
        return sumFlow;
    }

    public void setSumFlow(long sumFlow) {
        this.sumFlow = sumFlow;
    }

    public void setSumFlow() {
        this.sumFlow = this.upFlow + this.downFlow;
    }

    @Override
    public void write(DataOutput dataOutput) throws IOException {
        dataOutput.writeLong(upFlow);
        dataOutput.writeLong(downFlow);
        dataOutput.writeLong(sumFlow);
    }

    @Override
    public void readFields(DataInput dataInput) throws IOException {
        this.upFlow = dataInput.readLong();
        this.downFlow = dataInput.readLong();
        this.sumFlow = dataInput.readLong();
    }

    @Override
    public String toString() {
        return upFlow + "\t" + downFlow + "\t" + sumFlow;
    }
	//排序
    @Override
    public int compareTo(FlowBean o) {
        if (this.sumFlow > o.sumFlow) {
            return -1;
        } else if (this.sumFlow < o.sumFlow) {
            return 1;
        } else {
            if (this.upFlow > o.upFlow) {
                return 1;
            } else if (this.upFlow < o.upFlow) {
                return -1;
            } else {
                return 0;
            }
        }
    }
}

然后简单修改一下driver
在这里插入图片描述
注意,现在的输入数据,是之前的输出数据。
在这里插入图片描述
可以发现已经按照总流量进行降序排列了。
但是观察结果可以发现最后三行的总流量是相同的,所以现在增加需求,总流量相同时,安装下载流量排序。
继续修改FlowBean

    @Override
    public int compareTo(FlowBean o) {
        if (this.sumFlow > o.sumFlow) {
            return -1;
        } else if (this.sumFlow < o.sumFlow) {
            return 1;
        } else {
            if (this.upFlow > o.upFlow) {
                return 1;
            } else if (this.upFlow < o.upFlow) {
                return -1;
            } else {
                return 0;
            }
        }
    }

然后修改输入输出再次运行查看。
在这里插入图片描述

三、writableComparable排序(区内排序)

1.需求分析

基于前一个需求,增加自定义分区类,分区按照省份手机号设置。
在这里插入图片描述

2.代码编写

创建一个新的包,将上一个包中需要的class考过来。然后再新建一个分区器。
在这里插入图片描述
编写ProvincePartitioner2

package com.atguigu.mapreduce.partitionerandwritableComparable;

import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Partitioner;

public class ProvincePartitioner2 extends Partitioner<FlowBean, Text> {
    @Override
    public int getPartition(FlowBean flowBean, Text text, int i) {
        String phone = text.toString();

        String prePhone = phone.substring(0, 3);

        int partition;

        if ("136".equals(prePhone)) {
            partition = 0;
        } else if ("137".equals(prePhone)) {
            partition = 1;
        } else if ("138".equals(prePhone)) {
            partition = 2;
        } else if ("139".equals(prePhone)) {
            partition = 3;
        } else {
            partition = 4;
        }
        return partition;
    }
}

在简单修改一下driver的输出,就可以运行查看结果了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


总结

这次简单的记录了几个小小的案例,暂时就到这里吧。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值