在hadoop中找到最大的整数值(使用java编程)

时间:2013-02-18 23:58:38

标签: java hadoop mapreduce

我最近开始在hadoop工作,我刚刚学到了一些基本的理论知识。我正在尝试解决一个任务,其中输入应在文本文件中给出,例如input.txt(1 10 37 5 4 98 100等)

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

程序应该读取输入文件说一些随机数100 20 40 90 70,然后输出应该显示为100.我刚刚尝试用mapc中的wordcount示例修改代码并减少函数。但是因为我是新手开始编码hadoop我无法弄清楚我错在哪里。

1)是否有可能以这种方式找到解决方案?如果是的话,我无法在hadoop中创建一个arraylist并需要一些提示:-)

2)我们可以只打印'键'而不是键值对吗?如果是这样,请帮助我。我试着在reduce函数中编写代码而不打印它,但是我遇到了一些错误。

请指导我一些可以向前推进的提示。谢谢

1 个答案:

答案 0 :(得分:1)

阅读Hadoop Java API并编写以下函数:

Map: Identity function

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

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

Mapper 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);
}

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

你的reduce函数是(假设为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);
}