zoukankan      html  css  js  c++  java
  • hadoop中读取protobuf数据

    在mapreduce中读取protobuf数据时,会遇到一个坑


    BytesWritable。当你把byte[]数据保存到BytesWritable后,通过BytesWritable.getBytes()再读到的数据并不一定是原数据,可能变长了很多,这是因为BytesWritable采用了自动内存增长算法,你保存的数据长度为size时,它可能将数据保存到了长度为capacity(capacity>size)的buffer中,这时候,你通过BytesWritable.getBytes()得到的数据最后一些字符是多余的,如果里面保存的是protobuf序列化后的数据,则无法反序列化,这时候可以使用BytesWritable.setCapacity(BytesWritable.getLength())将后面多余空间剔除掉,然后就可以使用protobuf反序列为原始数据。


    关键代码如下


    conf.setInputFormat(SequenceFileAsBinaryInputFormat.class);

    public void map(Object key, BytesWritable values, OutputCollector output,
                Reporter reporter) throws IOException {
        values.setCapacity(values.getLength());// very important !!!
        byte[] data = values.getBytes();
        // more code
    }


  • 相关阅读:
    Mayan游戏
    选择客栈
    Redundant Paths
    中心选址
    辗转相除
    字符串
    线段覆盖
    配置魔药
    宝库通道
    教官的监视
  • 原文地址:https://www.cnblogs.com/hanfeihan1992/p/4504070.html
Copyright © 2011-2022 走看看