Я новичок в 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 решить эту проблему?
Я пробовал этот код. Но это дает мне исключение на этапе сокращения работы. Это трассировка стека ошибки. 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) –
Нужно ли мне менять какую-либо часть его редуктора? Мне нужно получить вывод как массив IntWritables. Пожалуйста, помогите мне ! –
Вы не можете отправлять значения «null» в IntArrayWritable. В вашем редукторе вы выделяете массив для 1000 значений 'IntWritable [] arr = new IntWritable [1000];', но вы используете только 150 из них, а остальные - «null». – vanekjar