Hadoop 序列化

一、优点

1、紧凑:节省内存

2、快速:读取速度快

3、可扩展:随着协议升级

4、互操作:支持多语言交互

二、Bean对象实现序列化

1、步骤

a、必须实现Writable接口
b、必须有空参构造,反序列化时,反射调用
c、重写序列化方法
d、重写反序列化方法
e、序列化方法和反序列化方法参数顺序要一致
f、重写 toString 用'	'连接
h、如果需要将自定义的bean放在key中传输,则还需要实现Comparable接口,因为MapReduce框中的Shuffle过程要求对key必须能排序

 三、示例

1、前提条件

创建Maven项目,导入依赖,配置log日志

2、思路

a、实现接口Writable
b、自定义属性
c、无参构造函数
d、get和set
e、tostring 连接使用 	
f、序列化
g、反序列化
注意:序列化和反序列化的顺序相同,相当于队列

3、代码

package com.flow;

import org.apache.hadoop.io.Writable;

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

public class FlowBean implements Writable {

    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;
    }

    @Override
    public String toString() {
        return upFlow + "	" + downFlow + "	" + sumFlow;
    }

    // 序列化
    public void write(DataOutput out) throws IOException {
        out.writeLong(upFlow);
        out.writeLong(downFlow);
        out.writeLong(sumFlow);
    }

    // 反序列化
    public void readFields(DataInput in) throws IOException {
        this.upFlow = in.readLong();
        this.downFlow = in.readLong();
        this.sumFlow = in.readLong();
    }

    public void set(long upFlow, long downFlow){
        this.upFlow = upFlow;
        this.downFlow = downFlow;
        this.sumFlow = upFlow + downFlow;
    }
}
原文地址:https://www.cnblogs.com/wt7018/p/13605515.html