2013-02-18 41 views
-4

我最近开始在hadoop中工作,并且刚刚学习了一些关于它的基本理论知识。我试图解决一个任务,其中输入将在文本文件中给出,例如input.txt(1 10 37 5 4 98 100等)在hadoop中查找最大整数值(使用java编程)

我需要找到给定输入中的最大整数(即整型)。我试图在arraylist中传递输入,以便可以将第一个整数与所有整数的其余部分进行比较(使用for-loop)。

该程序应该读取输入文件说一些随机数100 20 40 90 70,那么输出应显示为100.我刚刚试图修改代码与wordcount示例中的地图和减少功能。但是因为我是新来的开始在hadoop编码,我无法弄清楚我错了。

1)是否可以通过这种方式找到解决方案?如果是的话,我不能在hadoop这里创建一个数组列表,并且需要一些提示:-)

2)我们可以只打印'key'而不是键值对吗?如果有,请帮助我。我试图编码减少功能不打印它,但我得到一些错误。

请引导我一些提示,我可以继续前进。谢谢

+0

能帮你关于输入和预期输出是什么的更具体一点?什么是“最大价值”?我也注意到你把这个标记为字数;这与此有何关系?最后,[你有什么尝试?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – 2013-02-19 00:03:53

+0

该程序应该读取输入文件说一些随机数100 20 40 90 70,那么输出应该显示为100.我刚刚尝试在map和reduce函数中用wordcount示例修改代码。但是因为我是新来的开始在hadoop编码,我无法弄清楚我错了。 – user2085189 2013-02-19 01:07:32

回答

1

阅读Hadoop的Java API和编写以下功能:

Map: Identity function 

Reduce (or Combine): (K, List<V>) -> (K, max(List<V>)) 

关于你的评论,也有在MapReduce的无ArrayLists,那些不适合在内存中。值的列表作为迭代器传递,并且对象经常被重用以节省内存 - 因此您不能依赖其内容保持相同。

映射器API:http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/Mapper.html

为了您的映射你可以写下面的函数,或者只是使用预先实施IdentityMapper

public void map(K key, V val, Context context) 
throws IOException { 
    context.collect(key, val); 
} 

减速API:http://hadoop.apache.org/docs/r1.1.1/api/org/apache/hadoop/mapreduce/Reducer.html

你减少功能会(假设V implements Comparable<V>),并且为了简便起见,我们会说值包含至少一个项目:

public void reduce(K key, Iterator<V> values, Context context) 
throws IOException { 
    V max = values.next(); 
    while(values.hasNext()) { 
     V current = values.next(); 
     if(current.compareTo(max) > 0) 
      max = current; 
    } 
    context.collect(key, max); 
} 
+0

这里是什么?这是一个关键吗? – user2085189 2013-02-19 01:14:10

+0

对不起,错字。它应该是'K'。 – 2013-02-19 03:10:18

+0

好的。你能告诉我如何将输入作为hadoop中的数组传递吗? – user2085189 2013-02-19 12:08:15