Linux上的java MapReduce Hadoop多数据输入
我在VirtualBox上使用Ubuntu20.10和Hadoop版本3.2.1(如果您需要更多信息,请给我留言)
此时我的输出为我提供了以下信息:
Aaron Wells Peirsol ,M,17,United States,Swimming,2000 Summer,0,1,0
Aaron Wells Peirsol ,M,21,United States,Swimming,2004 Summer,1,0,0
Aaron Wells Peirsol ,M,25,United States,Swimming,2008 Summer,0,1,0
Aaron Wells Peirsol ,M,25,United States,Swimming,2008 Summer,1,0,0
对于上述输出,我希望能够将他的所有奖牌相加
(字符串末尾的三个数字代表金、银、铜
参赛者多年来在奥运会上获得的奖牌)
该项目没有规定年龄(17,21,25,25)
或者当它发生时(2000200420082008年夏天),但我必须添加奖牌
以便能够根据获得最多金牌的参与者等对其进行排序
有什么想法吗?如果您需要,我可以为您提供我的代码,但我需要另一个MapReduce,我想它将使用我上面导入的给定输入,并为我们提供如下内容:
Aaron Wells Peirsol,M,25,United States,Swimming,2008 Summer,2,2,0
如果我们有一种从reduce输出中删除“\t”的方法,它也将非常有益
谢谢大家抽出时间,Gyftonikolos Nikolaos
# 1 楼答案
虽然一开始看起来有点棘手,但这是WordCount示例的另一种情况,这一次只需要组合键和值,以便以
key-value
对的形式将数据从映射器添加到缩减器中对于映射器,我们需要从输入文件的每一行提取所有信息,并将列中的数据分为两个“类别”:
key
的每个运动员,主信息始终相同对于每一位运动员的台词,我们知道永远不会改变的栏目是运动员的姓名、性别、国家和运动。通过使用
,
字符作为每种数据类型之间的分隔符,所有这些都将被视为key
。列数据的其余部分将放在key-value
对的值端,但我们也需要在它们上使用分隔符,以便首先区分各个年龄段和奥运会年份的奖牌计数器。我们将使用:@
字符作为年龄和年份之间的分隔符#
字符_
字符作为这两者之间的分隔符在
Reduce
功能中,我们所要做的就是计算奖牌总数,并找出每个运动员的最新年龄和年份为了而不是在MapReduce作业输出的键和值之间有一个制表符,我们可以简单地将
NULL
设置为reducer生成的key-value
对的键,并使用,
字符作为分隔符,将所有计算的数据放在每对的值处此作业的代码如下所示:
当然,结果就是你想要的结果,如下所示: