努力学习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();
}
}
1条答案
按热度按时间e4yzc0pl1#
实施
compareTo()
以及equals()
这里很简单,就是compareTo()
在本例中,首先检查此对象是否ipaddress
与我们正在比较的另一个对象相同,如果相同,则根据timeStamp
值,否则比较结果由ipaddress
.这个
equals()
本例中的方法基本上声明WebLogWritable
只有当ipaddress
此对象的ipaddress
当timestamp
这个对象的大小等于另一个对象的大小timestamp
,仅此而已。有很多资源详细解释了这些方法,但是如果您仍然需要帮助,请告诉我。