首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有“自定义”键的MapReduce

带有“自定义”键的MapReduce
EN

Stack Overflow用户
提问于 2012-08-04 16:31:35
回答 2查看 448关注 0票数 1

我有以下问题:我有大量的键值对形式的数据。关键是一些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能以这种方式工作吗?

EN

回答 2

Stack Overflow用户

发布于 2012-08-04 21:06:55

在GridGain中,这可以通过将文本键存储在分区的数据网格中轻松地解决。GridGain数据网格将根据键在集群中自动划分您的数据集,因此,只要您的相似文本片段正确地实现了标准的java hashCode()和equals(),您就应该没问题。

您还可以在GridGain中发送基于亲和性的MapReduce任务,以确保您的作业结束在与数据相同的节点上,从而在您需要对数据运行一些计算时避免冗余的数据移动。这可以通过执行GridProjection.affinityRun(...)来实现方法。

票数 3
EN

Stack Overflow用户

发布于 2012-08-04 19:03:41

  1. 在映射阶段之后,它的输出使用分区程序(默认情况下是HashPartitioner,但您可以提供自己的分区程序)进行分区。你的TextKey应该实现一个LSH hashCode,这样相似的文本值可能会进入同一个分区。
  2. 如果键是字符串/文本对象,那么默认的排序器将会工作,但我认为考虑到你所描述的场景,这不会影响你的结果。
  3. 问题出在Grouper,它将一个分区中的每个组传递给一个reduce调用。默认情况下,此grouper遍历按此时刻排序的分区,并根据相等的值形成组。在您的情况下,您应该确保分组不是按相等进行的,而是按相似性进行的。因此,您的TextKey还应该实现compareTo()方法,如果LSH hashCodes相同,请注意返回0。

总之,您可以使用缺省数据路径(即缺省分区程序、排序程序、分组程序),但是您的TextKey (应该实现WritableComparable)应该在hashCode()compareTo()方法中发挥魔力

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11807134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档