Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hadoop Reducer不工作_Java_Hadoop_Mapreduce - Fatal编程技术网

Java Hadoop Reducer不工作

Java Hadoop Reducer不工作,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我在MapReduce工作中遇到了麻烦。Mymap函数确实运行并生成所需的输出。但是,reduce功能不运行。似乎该函数从未被调用过。我使用文本作为键,文本作为值。但我不认为这会造成问题 输入文件的格式如下: 2015-06-06,2015-06-06,40.80239868164062,-73.93379211425781,40.72591781616211,-73.98358154296875,7.71,35.72 2015-06-06,2015-06-06,40.7102012634277

我在MapReduce工作中遇到了麻烦。My
map
函数确实运行并生成所需的输出。但是,
reduce
功能不运行。似乎该函数从未被调用过。我使用文本作为键,文本作为值。但我不认为这会造成问题

输入文件的格式如下:

2015-06-06,2015-06-06,40.80239868164062,-73.93379211425781,40.72591781616211,-73.98358154296875,7.71,35.72
2015-06-06,2015-06-06,40.71020126342773,-73.96302032470703,40.72967529296875,-74.00226593017578,3.11,2.19
2015-06-05,2015-06-05,40.68404388427734,-73.97597503662109,40.67932510375977,-73.95581817626953,1.13,1.29
...
我想将行的第二个日期提取为
Text
,并将其用作reduce的键。键的值将是同一行中最后两个
float
值的组合。
i、 e.:
2015-06-06 7.71 35.72
2015-06-06 9.71 66.72

因此,可以将值部分视为由空白分隔的两列。
这实际上是可行的,我得到了一个具有许多相同键但不同值的输出文件

现在我想对每个键的两个浮点列求和,这样在reduce之后,我就可以得到一个日期作为键,并将求和的列作为值

问题:reduce无法运行

请参阅下面的代码:

映射器

public class Aggregate {

public static class EarnDistMapper extends Mapper<Object, Text, Text, Text> {

    public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

        String [] splitResult = value.toString().split(",");
        String dropOffDate = "";
        String compEarningDist = "";
        //dropoffDate at pos 1 as key 
        dropOffDate = splitResult[1];
        //distance at pos length-2 and earnings at pos length-1 as values separated by space
        compEarningDist = splitResult[splitResult.length -2] + " " + splitResult[splitResult.length-1];

        context.write(new Text(dropOffDate), new Text(compEarningDist));
    }
}
public static class EarnDistReducer extends Reducer<Text,Text,Text,Text> {

    public void reduce(Text key, Iterator<Text> values, Context context) throws IOException, InterruptedException {

         float sumDistance = 0;
         float sumEarnings = 0;
         String[] splitArray; 

         while (values.hasNext()){
             splitArray = values.next().toString().split("\\s+");
             //distance first
             sumDistance += Float.parseFloat(splitArray[0]);
             sumEarnings += Float.parseFloat(splitArray[1]);
         }

         //combine result to text

         context.write(key, new Text(Float.toString(sumDistance) + " " + Float.toString(sumEarnings)));
    }
}

谢谢你的帮助

您的
reduce
方法签名错误。你有:

public void reduce(Text key, Iterator<Text> values, Context context) {
public void reduce(文本键、迭代器值、上下文){
应该是:

public void reduce(Text key, Iterable<Text> values, Context context) {
public void reduce(文本键、Iterable值、上下文){

当你开始工作时,你得到了什么输出?输出是
2015-06-06 7.71 35.72 2015-06-06 9.71 66.72
加上更多的行。但是我从来没有看到聚合结果。如果我在reduce中放入
system.out.println
,控制台上就没有输出。你的程序的结构是什么?
Mapper
and
Reducer
类是
Aggregate
的内部类吗?它们都在同一个文件中吗?输出文件的名称是什么?是
part-r-00000
还是
part-m-00000
?@Philantrover是的,
Aggregate
类包装了另一个
Mapper
Reducer
类。因此它们是f
Aggregate
所有内容都包含在一个文件中。文件名ist
part-r-00000
public void reduce(Text key, Iterable<Text> values, Context context) {