EOF Исключение при использовании пользовательского типа данных Hadoop - biginsghts
Я впервые использую пользовательский тип данных в Hadoop. Вот мой код:
Тип пользовательских данных - массив значений, отображаемых в течение недели. каждая ячейка представляет один день:
public class Days implements Writable {
private int[] days;
public Days() {
days = new int[7];
}
public int[] getDays() {
return days;
}
public void updateDayCount(int day, int value){
days[day] += value;
}
public void addDays(int[] other){
for(int i=0 ; i<7 ; i++)
days[i] += other[i];
}
@Override
public void readFields(DataInput in) throws IOException {
days = new int[7];
for(int i=0 ; i<7 ; i++)
days[i] = in.readInt();
}
@Override
public void write(DataOutput out) throws IOException {
for(int i=0 ; i<7 ; i++)
out.write(days[i]);
}
@Override
public String toString() {
String ans = "";
for(int i=0 ; i<7 ; i++)
ans += days[i] + ",";
ans = ans.substring(0, ans.length()-1);
return ans;
}
Mapper - получить дату - преобразовать в день и добавить ее к определенной ячейке в типе данных:
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
if(key.get() > 0){
String line = value.toString();
String[] rowData = line.split(",");
if(rowData.length < 6){
return;
}
Days outDays = new Days();
outUserID = getUser(rowData);
String time = rowData[timeData].replaceAll("\"", "");
int day = -1;
try {
day = getTheDay(time);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//error
if(day == -1)
return;
outDays.updateDayCount(day, 1);
context.write(outUserID, outDays);
}
}
Я запускаю этот код и получаю EOFexception- он сказал это по методу readFields:
ReduceAttempt TASK_TYPE="REDUCE" TASKID="task_201412070957_3019_r_000000" TASK_ATTEMPT_ID="attempt_201412070957_3019_r_000000_1" TASK_STATUS="FAILED" FINISH_TIME="1422358846237" HOSTNAME="bgu-bi-server-02\.haifa\.ibm\.com" ERROR="java\.io\.EOFException
at java\.io\.DataInputStream\.readInt(DataInputStream\.java:403)
at myPack\.Days\.readFields(Days\.java:35)
я действительно не знаю почему. Кто-нибудь может понять, почему и может быть решение? пожалуйста помоги.
1 ответ
В пользовательских данных это должно быть
public void write(DataOutput out) throws IOException {
for(int i=0 ; i<7 ; i++)
out.writeInt(days[i]);
}
Спасибо, в любом случае!