我正在做一个 hadoop 项目,在多次访问各种博客和阅读文档之后,我意识到我需要使用 hadoop 框架提供的二次排序功能。
我的输入格式是这样的:
DESC(String) Price(Integer) 和一些其他文本
我希望 reducer 中的值按价格降序排列。 此外,在比较 DESC 时,我有一个方法接受两个字符串和一个百分比,如果两个字符串之间的相似性等于或大于百分比,那么我应该将它们视为相等。
问题是在 Reduce Job 完成后,我可以看到一些与其他字符串相似的 DESC,但它们在不同的组中。
这是我的 Composite 键的 compareTo 方法
public int compareTo(VendorKey o) {
int result =-
result = compare(token, o.token, ":") >= percentage ? 0:1;
if (result == 0) {
return pid> o.pid ?-1: pid < o.pid ?1:0;
}
return result;
}
以及Grouping Comparator的比较方法
public int compare(WritableComparable a, WritableComparable b) {
VendorKey one = (VendorKey) a;
VendorKey two = (VendorKey) b;
int result = ClusterUtil.compare(one.getToken(), two.getToken(), ":") >= one.getPercentage() ? 0 : 1;
// if (result != 0)
// return two.getToken().compareTo(one.getToken());
return result;
}
最佳答案
看来您的compareTo
方法违反了常见的contract这要求 sgn(x.compareTo(y))
等于 -sgn(y.compareTo(x))
。
关于java - Hadoop 中的二次排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38773248/