• Hadoop 中的 ArrayWritable


    虽然ArrayWritable不是接口,但貌似必须要子类去extends ArrayWritable,不能直接用ArrayWriable

     否则会报下面的错误?(不是很确定)

    java.lang.Exception: java.lang.RuntimeException: java.lang.NoSuchMethodException: org.apache.hadoop.io.ArrayWritable.<init>()

      

    下面是我自己实现的ArrayWritable,完全是自己摸索的网上看到的几篇感觉都不是很靠谱

    这个是为了Reduce输出结果中包含一个list,我研究一个晚上的时间,才把它弄好,结果后来发现标准答案,是用StringBuffer把list中的每个元素一个一个append然后输出的……  

    这样真的简化了太多的代码,而且实现难度变得低了不少。看来写代码还是要多动脑子。

    不过唯一的好处是研究了一下ArrayWritable的源码,同时自己实现了这个父类,也算是有所收获

    import org.apache.hadoop.io.ArrayWritable;
    import org.apache.hadoop.io.Text;
    import org.apache.hadoop.io.WritableFactories;
    /**
     * 自己实现ArrayWritable类,直接用好像会出问题
     * @author wmxl
     *
     */
    class TextArrayWritable extends ArrayWritable {
        
        //父类其实有一个private的value,可以直接用那个,具体看ArrayWritable源码
        private Text[] myValue = new Text[0];
        
        public Text[] getMyValue() {
            
            return myValue;
        }
    
        public void setMyValue(Text[] myValue) {
            this.myValue = myValue;
        }
    
        //这两个构造方法一定要实现TextArrayWritable() 和 TextArrayWritable(String[] strings) 而且里面要写super(Text.class)
        public TextArrayWritable() {
             super(Text.class);
        }
        
        public TextArrayWritable(String[] strings) {
            
            super(Text.class);
            Text[] texts = new Text[strings.length];
            
            for (int i = 0; i < strings.length; i++) {
                texts[i] = new Text(strings[i]);
            }
    //        set(texts);  //这个是set父类的value
            setMyValue(texts);
        }
    
        @Override
          public void readFields(DataInput in) throws IOException {  //这两个方法都是copy父类的,稍作改动,看的不是很懂
            myValue = new Text[in.readInt()];          // construct values
            for (int i = 0; i < myValue.length; i++) {
              Text value = (Text) WritableFactories.newInstance(Text.class);
              value.readFields(in);                       // read a value
              myValue[i] = value;                          // store it in values
            }
          }
    
          @Override
          public void write(DataOutput out) throws IOException {    //同上
            out.writeInt(myValue.length);                 // write values
            for (int i = 0; i < myValue.length; i++) {
                myValue[i].write(out);
            }
          }
          
        
        /**
         * 重写这个方法,让最后write文件中的结果是你想要的样子
         */
        @Override
        public String toString() {
            
            StringBuffer result = new StringBuffer();
            
            for(int i =0; i < this.getMyValue().length; i++){
                if(i == this.getMyValue().length -1)
                    result.append(this.getMyValue()[i].toString());
                else
                    result.append(this.getMyValue()[i].toString()).append(",");
            }
            
            return result.toString();
        }
        
        public void add(String friend){
            int len = getMyValue().length;
            Text[] newValue = new Text[len + 1];
            for(int i = 0; i < len + 1; i++){
                if(i < len)
                    newValue[i] = getMyValue()[i];
                else
                    newValue[i] = new Text(friend);
            }
    
            myValue = newValue;
        }
        /**
         * 自己写的添加元素方法
         * @param friend
         */
        public void add(Text friend){  
            int len = getMyValue().length;
            Text[] newValue = new Text[len + 1];
            for(int i = 0; i < len + 1; i++){
                if(i < len)
                    newValue[i] = getMyValue()[i];
                else
                    newValue[i] = new Text(friend);
            }
    
            myValue = newValue;
        }
    }

    参考了这篇文章:https://www.cnblogs.com/yancey/p/3946513.html

  • 相关阅读:
    projecthashing
    Windows 环境 gRPC环境搭建
    gitlab 适配性问题
    对 Golang 简洁架构实战的理解,以及 Golang 开源项目包定义的解惑
    Golang 关于百分比,小数点为数的问题
    Golang net/http 库日常 http 请求操作
    解决mysql建立事件时出现 “Cannot proceed because system tables used by Event Scheduler were found damaged at server start” 的错误
    如何在Linux安装Wine
    Public key for *.rpm is not installed
    从 IClassFactory 为 CLSID 为 {AA40D1D6CAEF4A56B9BBD0D3DC976BA2} 的 COM 组件创建实例失败,原因是出现以下错误: c001f011。
  • 原文地址:https://www.cnblogs.com/wmxl/p/10241251.html
Copyright © 2020-2023  润新知