java - Hadoop 中的二次排序

标签 java hadoop mapreduce hadoop2 hadoop-partitioning

我正在做一个 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/

相关文章:

java - 无法从 jar 读取输入

hadoop - Flume代理不包含任何有效 channel

hadoop - 如何在hadoop mapreduce中使用reducer

hadoop - 如何在 Cloudera 中安装自定义 Spark 版本

hadoop - 配置单元中的数据验证检查

Hadoop reducer 数量配置选项优先级

hadoop - 如何将第一行输出为列限定符名称

java - 具有 pojo 的 Freemarker HashMap 循环

java - 从java中读取文件后将数据值分成组

java - 无法使用 isLowerCase 找到符号