遇到错误,无法在发射函数中找到符号上下文

时间:2019-01-21 12:00:14

标签: hadoop mapreduce moving-average

我运行该程序并在编译代码时出现Context错误,并且不知道如何解决,请帮忙

  

错误:找不到符号

public static void emit(int key, ArrayList<Double> values, Context context) throws IOException, InterruptedException {
                                                              ^
     

符号:类上下文
    位置:类MovingAvg

(获取错误无法在发射函数中找到符号上下文)

package com.hadoop.imcdp;

import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import java.util.ArrayList;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.FloatWritable;
import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
import org.apache.hadoop.util.GenericOptionsParser;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;


public class MovingAvg {
  // For production the windowlength  would be a commandline or other argument        
  static double windowlength = 3.0;
  static int thekey = (int) windowlength / 2;
  // used for handlinag the circular list. 
  static boolean initialised = false;
  // Sample window
  static ArrayList <Double> window = new ArrayList <Double> ();

  // The Map method processes the data one point at a time and passes the circular list to the 
  // reducer. 
  public static class Map extends Mapper <LongWritable, Text, Text, Text> {
    private final static IntWritable one = new IntWritable(1);
    private Text word = new Text();

    public void map(LongWritable key, Text value, Context context) throws IOException {
      double wlen = windowlength;
      // creates windows of samples and sends them to the Reducer        
      partitionData(value, context, wlen);

    }

    // Create sample windows starting at each sata point and sends them to the reducer

    private void partitionData(Text value, Context context, double wlen)
    throws IOException {
      String line = value.toString();
      // the division must be done this way in the mapper. 
      Double ival = new Double(line) / wlen;
      // Build initial sample window
      if (window.size() < windowlength) {
        window.add(ival);
      }
      // emit first window
      if (!initialised && window.size() == windowlength) {
        initialised = true;
        emit(thekey, window, context);
        thekey++;
        return;
      }
      // Update and emit subsequent windows
      if (initialised) {
        // remove oldest datum                
        window.remove(0);
        // add new datum
        window.add(ival);
        emit(thekey, window, context);
        thekey++;
      }
    }
  }

  // Transform list to a string and send to reducer. Text to be replaced by ObjectWritable
  // Problem: Hadoop apparently requires all output formats to be the same so
  //          cannot make this output collector differ from the one the reducer uses.

  public static void emit(int key,
    ArrayList <Double> value,
    Context context) throws IOException {
    // public static void emit(int key, ArrayList<Double> value, OutputCollector<Text,Text> output) throws IOException, InterruptedException {
    Text tx = new Text();
    tx.set(new Integer(key).toString());

    String outstring = value.toString();
    // remove the square brackets Java puts in
    String tidied = outstring.substring(1, outstring.length() - 1).trim();

    Text out = new Text();
    out.set(tidied);

    context.write(tx, out);
  }

  public static class Reduce extends Reducer <Text, Text, Text, Text> {
    public void reduce(Text key,
      Iterator <Text> values,
      Context context
    ) throws IOException {

      while (values.hasNext()) {
        computeAverage(key, values, context);

      }

    }

    // computes the average of each window and sends to ouptut collector.      
    private void computeAverage(Text key, Iterator <Text> values, Context context)
    throws IOException {
      double sum = 0;
      String thevalue = values.next().toString();
      String[] thenumbers = thevalue.split(",");
      for (String temp: thenumbers) {
        // need to trim the string because the constructor does not trim.
        Double ds = new Double(temp.trim());
        sum += ds;

      }
      Text out = new Text();
      String outstring = Double.toString(sum);
      out.set(outstring);
      context.write(key, out);
    }
  }

  public static void main(String[] args) throws Exception {
    Configuration conf = new Configuration();
    Job job = new Job(conf);
    job.setJarByClass(MovingAvg.class);
    job.setJobName("MovingAvg");
    job.setInputFormatClass(TextInputFormat.class);
    job.setOutputFormatClass(TextOutputFormat.class);
    job.setOutputKeyClass(Text.class);

    job.setOutputValueClass(Text.class);
    job.setMapperClass(Map.class);
    job.setCombinerClass(Reduce.class);
    job.setReducerClass(Reduce.class);
    FileInputFormat.addInputPath(job, new Path(args[0]));
    FileOutputFormat.setOutputPath(job, new Path(args[1]));
    job.waitForCompletion(true);
  }
}

1 个答案:

答案 0 :(得分:0)

您粘贴的代码中没有Context类的import语句。通常,您的IDE会自动处理此问题。