编写自定义类作为 key 值 由于 MapReduce 中对 key 进行比较和排序,而 key 可以是任何实 现了 Writable 接口的类。 在 java 中,要实现类的大小比较可以实现 Comparable 接口并通 过重写 compareTo 方法来实现。 在 Mapreduce 中,如果需要自定义类的排序规则,需要让类实现 Writable 的子接口 WritableComparable,重写里面的 write, readFields 6 和 compareTo 方法,所以可以自定义一个类作为 key,类中包含 2 个 需要进行排序的字段,并在类中实现比较算法,先判断 first_name 是 否相等,如果相等再比较 last_name
时间: 2024-03-22 19:40:16 浏览: 64
String类下compareTo()与compare()方法比较
5星 · 资源好评率100%
是否相等。以下是一个自定义类作为 key 的示例:
```java
import java.io.DataInput;
import java.io.DataOutput;
import java.io.IOException;
import org.apache.hadoop.io.WritableComparable;
public class Name implements WritableComparable<Name> {
private String first_name;
private String last_name;
public Name() {}
public Name(String first_name, String last_name) {
this.first_name = first_name;
this.last_name = last_name;
}
public String getFirstName() {
return first_name;
}
public String getLastName() {
return last_name;
}
@Override
public void write(DataOutput out) throws IOException {
out.writeUTF(first_name);
out.writeUTF(last_name);
}
@Override
public void readFields(DataInput in) throws IOException {
first_name = in.readUTF();
last_name = in.readUTF();
}
@Override
public int compareTo(Name other) {
int cmp = first_name.compareTo(other.first_name);
if (cmp != 0) {
return cmp;
}
return last_name.compareTo(other.last_name);
}
}
```
在这个例子中,我们定义了一个 Name 类,包含了两个需要排序的字段 first_name 和 last_name。实现了 WritableComparable 接口,重写了 write, readFields 和 compareTo 方法。在 compareTo 方法中,我们先比较 first_name 是否相等,如果相等再比较 last_name,最终返回比较的结果。
在使用 MapReduce 的时候,可以直接将这个自定义类作为 key 类型,MapReduce 会自动调用其 write, readFields 和 compareTo 方法。
阅读全文