2015-02-23 4 views
2

Я новичок в Hadoop и работал с ArrayWritables в Hadoop map-reduce.Проблема при работе с ArrayWritables

И это Mapper код, я использую: -

public class Base_Mapper extends Mapper<LongWritable, Text, Text, IntWritable> { 
    String currLine[] = new String[1000]; 
    Text K = new Text(); 

    public void map(LongWritable key, Text value, Context context) 
      throws IOException, InterruptedException { 
     String line = value.toString(); 
     currLine = line.split(""); 
     int count = 0; 
     for (int i = 0; i < currLine.length; i++) { 
      String currToken = currLine[i]; 
      count++; 
      K.set(currToken); 
      context.write(K, new IntWritable(count)); 
     } 

    } 
} 

Разбавление: -

public class Base_Reducer extends Reducer<Text, IntWritable,Text, IntArrayWritable> { 

    public void reduce(Text key, Iterable<IntWritable> values, Context context) 
      throws IOException, InterruptedException { 
     IntArrayWritable finalArray = new IntArrayWritable(); 
     IntWritable[] arr = new IntWritable[1000]; 
     for (int i = 0; i < 150; i++) 
      arr[i] = new IntWritable(0); 
     int redCount = 0; 
     for (IntWritable val : values) { 
      int thisValue = val.get(); 
      for (int i = 1; i <= 150; i++) { 
       if (thisValue == i) 
        arr[i - 1] = new IntWritable(redCount++); 
      } 
     } 
     finalArray.set(arr); 
     context.write(key, finalArray); 
    } 

} 

Я использую IntArrayWritable в качестве подкласса ArrayWritable, как показано ниже: -

import org.apache.hadoop.io.ArrayWritable; 
import org.apache.hadoop.io.IntWritable; 

public class IntArrayWritable extends ArrayWritable { 
    public IntArrayWritable() { 
     super(IntWritable.class); 
    } 

    public IntArrayWritable(IntWritable[] values) { 
     super(IntWritable.class, values); 
    } 
} 

Мой Предназначенный вывод задания был некоторый набор баз как ключ (который является правильным) и массив IntWritables в качестве значения. Но я получаю выход, как: -

[email protected] 
A [email protected] 
C [email protected] 
G co[email protected] 
N [email protected] 
T [email protected] 

Что все изменения, которые я должен сделать, чтобы Inorder решить эту проблему?

ответ

3

Вам необходимо переопределить поведение по умолчанию метода toString() в вашей реализации IntArrayWritable.

Пожалуйста, попробуйте следующее:

import org.apache.hadoop.io.ArrayWritable; 
import org.apache.hadoop.io.IntWritable; 

public class IntArrayWritable extends ArrayWritable { 
    public IntArrayWritable() { 
     super(IntWritable.class); 
    } 

    public IntArrayWritable(IntWritable[] values) { 
     super(IntWritable.class, values); 
    } 

    @Override 
    public String toString() { 
     StringBuilder sb = new StringBuilder("["); 

     for (String s : super.toStrings()) 
     { 
      sb.append(s).append(" "); 
     } 

     sb.append("]") 
     return sb.toString(); 
    } 
} 

Если вам понравился этот ответ, пожалуйста, отметьте его как принято. Спасибо.

+0

Я пробовал этот код. Но это дает мне исключение на этапе сокращения работы. Это трассировка стека ошибки. StackTrace ::: Ошибка: java.lang.NullPointerException \t на org.apache.hadoop.io.ArrayWritable.toStrings (ArrayWritable.java:74) \t в com.feathersoft.Base.IntArrayWritable.toString (IntArrayWritable.java:18) \t at org.apache.hadoop.mapreduce.lib.output.TextOutputFormat $ LineRecordWriter.writeObject (TextOutputFormat.java:85) –

+0

Нужно ли мне менять какую-либо часть его редуктора? Мне нужно получить вывод как массив IntWritables. Пожалуйста, помогите мне ! –

+0

Вы не можете отправлять значения «null» в IntArrayWritable. В вашем редукторе вы выделяете массив для 1000 значений 'IntWritable [] arr = new IntWritable [1000];', но вы используете только 150 из них, а остальные - «null». – vanekjar

 Смежные вопросы

  • Нет связанных вопросов^_^