【问题标题】:how to use similarity algorithm for keys of hadoop map resuce job如何对hadoop mapreduce作业的键使用相似度算法
【发布时间】:2012-11-02 20:51:45
【问题描述】:

我需要实现以下问题: 我正在获取类型的数据

public class Data{   
  private String key;
  private String valueData;
}

我需要编写一个 map reduce 作业来获取所有 唯一 键,每个键都有一个(随机)valueData。 hadoop 听起来很简单,是的,我知道如何实现。

但真正的问题是,我还需要减少所有“similar”键。 并且输出应该是具有 dataValue

之一的类似 key 之一

在 hadoop 中实现这一点的最佳方式(以及如何)是什么?我也想灵活地改变相似度算法。

【问题讨论】:

  • 感谢 cmets。我只想澄清更基本的问题。当我使用 Map/Reduce 时,Reduce 得到所有相同的键和值列表。我怎样才能“更新”默认的 map reduce 键比较器,所以只有一个相似的键会出现在 Reduce 函数中?我正在寻找简单的 java Map/Reduce 代码

标签: java hadoop mapreduce cascading


【解决方案1】:

看看MinHashing 技术,它与 MapReduce 一起广泛用于此任务。

相似度指标绑定Jaccard,不知道有没有其他方法。但是,一旦您计算了近键,您就可以使用另一个指标来衡量它们之间的相似性,因为 minhashing 大大减少了您的搜索空间。

您可以在维基百科上阅读更多内容:http://en.wikipedia.org/wiki/MinHash

Mahout 有一个MinHash 聚类算法,你可以看看那里。它很容易理解,并具有多种散列算法。

【讨论】:

  • 谢谢,很好,我看看mahout的用法。如果我正在编写复合键并覆盖方法 -equals- 和 -compareTo- 方法,但不覆盖 -hashCode- 我的代码会正常工作吗?
  • 你需要向量化你的键,我假设你的键是文本,所以你可以使用 shingling (en.wikipedia.org/wiki/W-shingling) 使搜索更加模糊。 Mahout 负责矢量化您的文本键,然后可以在它们上聚集。
【解决方案2】:

你基本上需要想出一个函数,f,这样,尽可能地:

f(A) = f(B) if and only if A and B are "similar"

现在,您能够遵守的严格程度完全取决于这些值的确切域是什么,以及您的相似性指标是什么,但这是目标。

例如,如果键是实数,那么我可能会选择f(x) = round(x)。对于非常接近的 x 值,f(x) 可能相同,但也可能不同,例如 2.45 和 2.55。但也许你可以允许这种“足够好”。

然后,您可以将您的 reduce 步骤的关键作为此函数的输出。

我还要补充一点,对于特定的相似性指标和特定的聚类方法,还有许多其他复杂的技术 - 如果您提供更多关于您希望的指标类型的详细信息,也许我可以为您指出其中之一使用,或者“相似”键到底是什么。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2012-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多