我是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/