我正在尝试将我的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中创建一个新文件。
答案 0 :(得分:2)
您的问题等同于大多数开发人员开始使用的标准WordCount MapReduce示例。
WordCount是一个具有Map和Reduce阶段的MapReduce作业。
Mapper从输入文件中读取每一行,一次一个。它会发出一个键,即值(在您的情况下为名称)和计数为1。
根据Key(名称)减少组并将值相加,最后发出一个键以及该键被看到的总次数。
您会注意到该示例包含一个Combine阶段,该阶段(基本上)在Mapper的输出上运行。在这个例子中,Reduce可以重复使用,因为逻辑是相同的,它接收和发出相同类型的键/值对象。组合器将减少发送到Reduce阶段的数据量。