我是Java和Hadoop的新手。我正在尝试一个非常简单的程序来获取频繁配对。

例如

Input: My name is Foo. Foo is student.
Intermediate Output:
    Map:
        (my, name): 1
        (name ,is): 1
        (is, Foo): 2 // (is, Foo) = (Foo, is)
        (is, student)


所以最后它应该给频密的对是(is ,Foo)

伪代码如下所示:

Map(Key: line_num, value: line)
words = split_words(line)
for each w in words:
     for each neighbor x:
          emit((w, x)), 1)


这里我的钥匙不是一对,而是一对。在阅读文档时,我读到每个必须实现WritableComparable的新密钥。

所以我对此感到困惑。如果有人可以解释这堂课,那太好了。不确定这是真的。然后,我可以自己弄清楚该怎么做!

我既不需要映射器,也不需要任何映射器……只想了解WritableComparable的作用是什么?哪种WritableComparable方法实际上比较键?我可以看到equals和compareTo,但是找不到任何解释。请没有密码!谢谢

编辑1:
在compareTo中,我对(a,b)=(b,a)返回0,但仍然不会返回相同的reducer,在compareTo方法中有什么方法可以将键(b,a)重置为(a,b)或生成全新的钥匙?

编辑2:
我不知道生成新密钥,但是在compareTo更改逻辑中,它工作正常..!感谢大家!

最佳答案

WritableComparable是使实现该类的类有两方面的接口:Writable,表示可以通过序列化等将其写入网络或从网络中读取。如果要将其用作键或值,以便可以在Hadoop节点之间发送。 Comparable,这意味着必须提供一些方法,以显示如何将给定类的一个对象与另一个对象进行比较。当Reducer按键组织时,将使用此功能。

要创建自己的对象作为键时,此接口是必需的。而且您需要创建自己的InputFormat,而不是使用Hadoop随附的之一。 (根据我的经验)这可能会变得相当困难,特别是如果您是Java和Hadoop的新手。

因此,如果我是您,那么我就不会再打扰了,因为有一种更简单的方法。我会使用TextInputFormat,它既是默认的InputFormat,又非常易于使用和理解。您可以简单地将每个键作为Text对象发出,这与字符串非常相似。但是有一个警告。就像您提到的"is Foo""Foo is"需要被评估为相同的键。因此,对于您拉出的每对单词,在使用String.compareTo方法将它们作为键传递之前,请按字母顺序对其进行排序。这样,您就可以保证没有重复。

关于java - MapReduce-WritableComparables,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12625669/

10-11 06:29