努力学习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();
}
}
答案 0 :(得分:0)
此处compareTo()
和equals()
的实现非常简单,本例中的compareTo()
首先检查此对象的ipaddress
是否与其他对象相同我们正在比较,如果它是相同的,那么比较是基于timeStamp
值完成的,否则比较结果由ipaddress
的值确定。
在这种情况下,equals()
方法基本上表明两个类型为WebLogWritable
的对象仅相等且仅当此对象的ipaddress
等于ipaddress
时才另一个对象的AND当这个对象的timestamp
等于另一个对象的timestamp
时,那就是它的全部内容。
有许多资源可以详细解释这些方法,但如果您仍需要帮助,请告诉我。