如何将Java代码转换为mapreduce?

时间:2016-05-18 02:42:14

标签: java hadoop mapreduce hdfs

我正在尝试将我的Java代码转换为Hadoop MapReduce。 我是MapReduce编程的新手,所以请你帮我解决这个问题。

我正在尝试计算文件中所有不同的值,并将输出显示在另一个文件中。

输入: 亚历克斯 亚历克斯 约翰 斯图尔特 迈克尔 约翰 迈克尔 亚历

输出: 亚历克斯3

John 2

Stuart 1

Michael 2

这是我的代码:

public class test {

    public static void main(String[] args) throws Exception {
        String[] arr = { "sa", "pa" , "ga", "sa", "pa", "la" };
        String[] result = new String[10];
        int counter = 0, count = 0;
        for (int i = 0; i < arr.length; i++) {
            boolean isDistinct = false;
            for (int j = 0; j < i; j++) {
                if (arr[i] == arr[j]) {
                    isDistinct = true;
                    break;
                }
            }
            if (!isDistinct) {
                result[counter++] = arr[i];
            }
        }
        for (int i = 0; i < counter; i++) {
            count = 0;
            for (int j = 0; j < arr.length; j++) {
                if (result[i] == arr[j]) {
                    count++;
                }

            }
            System.out.println(result[i] + " = " + count);

        }
    }
}

在这段代码中,我将输入作为数组,但在实际情况下,我需要从HDFS中的文件中获取。

文件的Plus输出应该是在HDFS中创建一个新文件。

1 个答案:

答案 0 :(得分:2)

您的问题等同于大多数开发人员开始使用的标准WordCount MapReduce示例。

Example: WordCount v1.0

WordCount是一个具有Map和Reduce阶段的MapReduce作业。

Mapper从输入文件中读取每一行,一次一个。它会发出一个键,即值(在您的情况下为名称)和计数为1。

根据Key(名称)减少组并将值相加,最后发出一个键以及该键被看到的总次数。

您会注意到该示例包含一个Combine阶段,该阶段(基本上)在Mapper的输出上运行。在这个例子中,Reduce可以重复使用,因为逻辑是相同的,它接收和发出相同类型的键/值对象。组合器将减少发送到Reduce阶段的数据量。