技术库 > 网站架构

hadoop数据类型 自定义数据类型 序列化

技术库:tec.5lulu.com

Java序列化序列化概念

from:tec.5lulu.com

JVM把数据写到JVM管理范畴之外, 然后将这些数据读回来放在JVM管理范畴内时,

需要一些处理才能被识别,写出去就是序列化,读取回JVM管理范畴内就是反序列化 

1 Java序列化的不足

1.不精简。附加Java序列化的不足:
1.不精简。附加信息多。不大适合随机访问。
2.存储空间大。递归地输出类的超类描述直到不再有超类。序列化图对象,反序列化时为每个对象新建一个实例。相反。Writable对象可以重用。
3.扩展性差。而Writable方便用户自定义信息多。不大适合随机访问。

4. 总结一句话:

   Java序列化面向对象 有继承关系,就是将这个对象是祖宗十八代全给序列化和反序列化,很费空间 

2 Hadoop序列化的特点

紧凑:高效使用存储空间
快速:读写数据的额外开销小
可扩展:可透明地读取老格式的数据
互操作:支持多语言的交互 

 Hadoop序列化的接口: Writable ---> 点进去看到DataOutput---> 点进去 ctrl + o 看方法,会发现,其所有write(...) 都是针对基本数据类型的写出方法,没有针对自定义类型的方法 

Hadoop的数据类型要求必须实现hadoop的Writable接口,实现后除了具备更节省空间特点外,还可以支持用户自定义数据类型这个特点 

java基本类型与Hadoop常见基本类型的对照

java基本类型 Hadoop基本类型
 Long LongWritable
 Integer  IntWritable
 Boolean BooleanWritable
 String  Text


两者的相互转化:


java类型如何转化为hadoop基本类型?
 答:调用hadoop类型的构造方法,或者调用set()方法。  new LongWritable(123L);

 问:hadoop基本类型如何转化为java类型?
 答:对于Text,需要调用toString()方法,其他类型调用get()方法。 

hadoop是做大数据的,为何这么吝啬于简洁版本的序列化??

正是因为操作大数据,数据之间从map节点到reduce节点传输时,才要更小的开销IO流。以达到快速的目的。 

3 Hadoop自定义类型

class KpiWritable1 implements Writable{  
      
    long upPackNum; // 上传数据包个数  
    long downPackNum;// 下载数据包个数  
    long upPayLoad;// 上传数据  
    long downPayLoad;// 下载数据  
  
    public KpiWritable1(String upPackNum,String downPackNum,String upPayLoad,String downPayLoad){  
        this.upPackNum = Long.parseLong(upPackNum);  
        this.downPackNum = Long.parseLong(downPackNum);  
        this.upPayLoad = Long.parseLong(upPayLoad);  
        this.downPayLoad = Long.parseLong(downPayLoad);  
    }  
      
    public KpiWritable1(){}  
      
    @Override  
    public void write(DataOutput out) throws IOException {  
        // 先写后读  
        out.writeLong(this.upPackNum);  
        out.writeLong(this.downPackNum);  
        out.writeLong(this.upPayLoad);  
        out.writeLong(this.downPayLoad);  
    }  
  
    @Override  
    public void readFields(DataInput in) throws IOException {  
        // 读取的时候, 按照写方法的顺序( 队列方式) 顺序读取  
        this.upPackNum = in.readLong();  
        this.downPackNum = in.readLong();  
        this.upPayLoad = in.readLong();  
        this.downPayLoad = in.readLong();  
    }  
      
    @Override  
    public String toString() {  
        return upPackNum + "t" + downPackNum + "t" + upPayLoad + "t" + downPayLoad;  
    }  
}   

针对String类型的读写:  
  
使用 org.apache.hadoop.io.Text   
  
@Override  
        public void write(DataOutput out) throws IOException {  
              
            Text.writeString(out, name);  
        }  
  
        @Override  
        public void readFields(DataInput in) throws IOException {  
              
            this.name = Text.readString(in);  
        }  

 查看源码,发现 都是基本类型的比较 

LongWritable:  
  
 /** Compares two LongWritables. */  
  @Override  
  public int compareTo(LongWritable o) {  
    long thisValue = this.value;  
    long thatValue = o.value;  
    return (thisValue<thatValue ? -1 : (thisValue==thatValue ? 0 : 1));  
  }  
  
  
Text:  mr处理中文的时候 使用u8方式  文字以binarybytes比较  
  
public class Text extends BinaryComparable  
    implements WritableComparable<BinaryComparable> {  
  
protected CharsetDecoder initialValue() {  
      return Charset.forName("UTF-8").newDecoder().       
   
   
 ArrayWritable 里面是对数组的封装  
   
   
 NullWritable 输入和写出方法都是空  

hadoop数据类型 自定义数据类型 序列化


标签: 序列化 hadoop本文链接 http://tec.5lulu.com/detail/105drn2i5p6wt8s09.html

我来评分 :6.1
0

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com