我正在阅读书中的MapReduce类型和格式" HADOOP The Definitive Guide"。 MapReduce类型的一般形式如下:
map:(K1,V1) - >列表(K2,V2)
reduce:(K2,list(V2)) - >清单(K3,V3)
也
map:(K1,V1) - >列表(K2,V2)
组合:( K2,列表(V2) - >列表(K2,V2)
reduce:(K2,list(V2)) - >清单(K3,V3)
如何以这种通用格式解决字数统计问题。假设我有一个文本文件:
AAA BBB CCC
DDD EEE AAA
GGG CCC BBB
现在在(K1,V1)中格式化文本文件
格式(K1,V1)
(0,AAA BBB CCC)
(10,DDD EEE AAA)
(21,GGG CCC BBB)
我该怎么办?如果有任何错误,请纠正我。 谢谢!
答案 0 :(得分:1)
让我们逐步完成对您数据的一系列转换。 我们从原始数据开始:
AAA BBB CCC
DDD EEE AAA
GGG CCC BBB
假设我们使用TextInputFormat作为InputFormat。 然后,映射器的输入将是键,值对看起来像这样:
0 AAA BBB CCC
13 DDD EEE AAA
26 GGG CCC BBB
这里,文件被分成几行。关键是文件中的位置,值是行本身,作为字符串。
映射器需要采用这些行(忽略它们的位置)并将它们转换为键值对的列表。作为示例,让我们将第一行AAA BBB CCC
转换为键值对的列表:
AAA 1
BBB 1
CCC 1
我们通过使用空格字符作为分隔符拆分字符串来完成此操作。这里,每个键都是一个单词,值是该单词的计数。请注意,这只是进行映射的一种方法,还有其他同样有效的方法。
在映射所有三行之后,我们得到以下键值对的列表:
AAA 1
BBB 1
CCC 1
DDD 1
EEE 1
AAA 1
GGG 1
CCC 1
BBB 1
上面的键,值对按键排序,我们得到:
AAA 1
AAA 1
BBB 1
BBB 1
CCC 1
CCC 1
DDD 1
EEE 1
GGG 1
然后将具有相同密钥的所有值分组到一个列表中(由于它们按密钥排序,因此可以有效地完成):
AAA [1, 1]
BBB [1, 1]
CCC [1, 1]
DDD 1
EEE 1
GGG 1
在这种情况下,组合器和减速器做同样的事情,所以我们假设最初没有组合器。
我们还假设只有一个reducer节点。 (在多个reducer设置中,我们保证相同键的所有值都将转到同一个reducer。)
我们的reducer总结了每个键列表中的元素,产生了:
AAA 2
BBB 2
CCC 2
DDD 1
EEE 1
GGG 1
这是所需的字数。