-4

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

我需要在给定的输入中找到最大的整数(即整数类型)。我正在尝试传递数组列表中的输入,以便我可以将第一个整数与所有整数的其余部分进行比较(使用 for 循环)。

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

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

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

请指导我一些提示,我可以通过这些提示继续前进。谢谢

4

1 回答 1

1

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

Map: Identity function

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

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

映射器 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

您的 reduce 函数将是(假设V implements Comparable<V>),为简洁起见,我们会说 values 至少包含一项:

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);
}
于 2013-02-19T00:02:54.530 回答