我有以下问题:我有大量的键值对形式的数据。关键是一些id和值--一些文本。我的目标是将这些对象分组到文本片段在某种程度上“相似”的集群中。因此,如果将我的文本片段作为键,将id作为值,那么它看起来就像是MapReduce的任务。但这样的键不是传统的MapReduce使用方式,而且我并不真正了解MapReduces框架的内部实现,所以我不确定这种方式是否有效。所以我的详细想法是: 1.在Java中使用一些MapReduce (Hadoop,GridGain) 2.为我的文本片段创建特殊的类(比如TextKey) 3.重写该类的equals(),在这里打包文本比较逻辑(比如莱文斯坦距离比较,等等) 4.重写compareTo()以允许MapReduce按键排序(比如字典序顺序) 5.可能重写hashCode() 6.将我的数据映射到键值对: key -> text pieces,打包在TextKey类中,取值-> in 7.通过收集每个“相等”(实际上类似)键的in来简单地缩减
MapReduce能以这种方式工作吗?
发布于 2012-08-04 21:06:55
在GridGain中,这可以通过将文本键存储在分区的数据网格中轻松地解决。GridGain数据网格将根据键在集群中自动划分您的数据集,因此,只要您的相似文本片段正确地实现了标准的java hashCode()和equals(),您就应该没问题。
您还可以在GridGain中发送基于亲和性的MapReduce任务,以确保您的作业结束在与数据相同的节点上,从而在您需要对数据运行一些计算时避免冗余的数据移动。这可以通过执行GridProjection.affinityRun(...)来实现方法。
发布于 2012-08-04 19:03:41
compareTo()方法,如果LSH hashCodes相同,请注意返回0。总之,您可以使用缺省数据路径(即缺省分区程序、排序程序、分组程序),但是您的TextKey (应该实现WritableComparable)应该在hashCode()和compareTo()方法中发挥魔力
https://stackoverflow.com/questions/11807134
复制相似问题