在Mapreduce中创建自定义可写数据类型时的CompareTo和Equals方法 - 解释

时间:2016-06-21 23:22:02

标签: java hadoop mapreduce

努力学习mapreduce编程,非常感兴趣和兴奋。我在博客上遇到过在Mapreduce中编写Custom Writable数据类型的问题。它位于http://hadooptutorial.info/creating-custom-hadoop-writable-data-type/#comment-15753

我能够在我的最后实现这个代码。它运行正常。但我不太了解COmpareTo和Equals方法。有人可以根据这个数据集解释这两种方法吗?我知道在分区阶段将使用CompareTo和Equals方法,在分区程序阶段将使用hashCode()。但我很难理解CompareTo和Equals方法。如果有人试图解释它们,我们将非常感激。

输入数据集是一个Web日志,日志文件中的每一行都是一条记录。该程序的作者创建了一个自定义数据类型来读取Web日志。

示例输入数据集:

41823 /miwttvnllumo.html 2014-03-10 12:25:44 418.233.13.412

8350 /ilyhxttpxu.html 2014-03-10 12:23:20 4.175.198.160

127248 /rr.html 2014-03-10 12:32:08 42.416.153.181

81262 /illrz.html 2014-03-10 12:25:17 203.156.137.68

705636 /tzvvxhst.html 2014-03-10 12:18:10 141.127.120.127

程序的输出显示IP地址(上面数据集中的最后一个字段)和Web日志数据集中的出现次数。代码工作正常。

这是实现WritableComparable接口的WebLogWritable类:

BTW我明白,默认情况下,无论何时创建对象,都会生成hashCode。因为,如果我们将该类的多个实例保存到任何集合或数组中,并且如果我们需要对它们进行排序,则将通过hashCode完成排序,即每个对象在创建时分配。

 import java.io.*;
 import org.apache.hadoop.io.*;

 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;

 import org.apache.hadoop.mapreduce.Job;
 import org.apache.hadoop.mapreduce.Mapper;
  import org.apache.hadoop.mapreduce.Reducer;
 import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
 import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;


 public class WebLogWritable implements WritableComparable<WebLogWritable>
 {
   private Text siteURL, reqDate, timestamp, ipaddress;
   private IntWritable reqNo;


    //Default Constructor
 public WebLogWritable() 
 {
  // System.out.println("const");
    this.siteURL = new Text();

    this.reqDate = new Text();

    this.timestamp = new Text();

    this.ipaddress = new Text();

    this.reqNo = new IntWritable();
 }

  //Custom Constructor
   public WebLogWritable(IntWritable reqno, Text url, Text rdate, Text  rtime, Text rip) 
   {

      this.siteURL = url;
      this.reqDate = rdate;
      this.timestamp = rtime;
      this.ipaddress = rip;
      this.reqNo = reqno;
   }

     //Setter method to set the values of WebLogWritable object
    public void set(IntWritable reqno, Text url, Text rdate, Text rtime, Text rip) 
    {
      this.siteURL = url;
      this.reqDate = rdate;
      this.timestamp = rtime;
      this.ipaddress = rip;
      this.reqNo = reqno;
    }

     //to get IP address from WebLog Record
     public Text getIp()
    {
      return ipaddress; 
      }

  @Override
 //overriding default readFields method. 
  //It de-serializes the byte stream data
   public void readFields(DataInput in) throws IOException 
  {
      ipaddress.readFields(in);
      timestamp.readFields(in);
      reqDate.readFields(in);
      reqNo.readFields(in);
      siteURL.readFields(in);
   }

  @Override
  //It serializes object data into byte stream data
   public void write(DataOutput out) throws IOException 
  {
       ipaddress.write(out);
       timestamp.write(out);
       reqDate.write(out);
       reqNo.write(out);
       siteURL.write(out);
    }


   @Override
    public int compareTo(WebLogWritable o) 
   {
      // System.out.println("fdfddf");
     if (ipaddress.compareTo(o.ipaddress)==0)
     {
         return (timestamp.compareTo(o.timestamp));
     }
     else return (ipaddress.compareTo(o.ipaddress));
    }



   @Override
  public boolean equals(Object o) 
  {
      if (o instanceof WebLogWritable) 
     {
         WebLogWritable other = (WebLogWritable) o;

         return ipaddress.equals(other.ipaddress) &&     timestamp.equals(other.timestamp);

       }
       return false;
     }


   @Override
   public int hashCode()
   {
      //System.out.println(ipaddress.hashCode())   ;
    return ipaddress.hashCode();
    }


   }

1 个答案:

答案 0 :(得分:0)

此处compareTo()equals()的实现非常简单,本例中的compareTo()首先检查此对象的ipaddress是否与其他对象相同我们正在比较,如果它是相同的,那么比较是基于timeStamp值完成的,否则比较结果由ipaddress的值确定。

在这种情况下,equals()方法基本上表明两个类型为WebLogWritable的对象仅相等且仅当此对象的ipaddress等于ipaddress时才另一个对象的AND当这个对象的timestamp等于另一个对象的timestamp时,那就是它的全部内容。

有许多资源可以详细解释这些方法,但如果您仍需要帮助,请告诉我。