compareto和equals方法,同时在mapreduce-explauration中创建自定义可写数据类型

ny6fqffe  于 2021-06-02  发布在  Hadoop
关注(0)|答案(1)|浏览(318)

努力学习mapreduce编程,非常感兴趣和兴奋。我在一个博客上看到过关于在mapreduce中编写自定义可写数据类型的内容。可在http://hadooptutorial.info/creating-custom-hadoop-writable-data-type/#comment-15753
我能够在我的终端实现这个代码。一切正常。但我不太懂compareto和equals方法。有人能解释一下这两种方法吗?我知道在排序阶段将使用compareto和equals方法,在分区阶段将使用hashcode()。但是我很难理解比较和相等的方法。如果有人能解释一下,我将不胜感激。
输入数据集是一个web日志,日志文件中的每一行都是一条记录。这个程序的作者创建了一个自定义数据类型来读取web日志。
示例输入数据集:
41823/miwtvnllumo.html 2014-03-10 12:25:44 418.233.13.412
8350/ilyhxtpxu.html 2014-03-10 12:23:20 4.175.198.160
127248/rr.html 2014年3月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类:
顺便说一句,我知道在默认情况下,每当创建一个对象时,都会生成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();
    }

   }
e4yzc0pl

e4yzc0pl1#

实施 compareTo() 以及 equals() 这里很简单,就是 compareTo() 在本例中,首先检查此对象是否 ipaddress 与我们正在比较的另一个对象相同,如果相同,则根据 timeStamp 值,否则比较结果由 ipaddress .
这个 equals() 本例中的方法基本上声明 WebLogWritable 只有当 ipaddress 此对象的 ipaddresstimestamp 这个对象的大小等于另一个对象的大小 timestamp ,仅此而已。
有很多资源详细解释了这些方法,但是如果您仍然需要帮助,请告诉我。

相关问题