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]);
}

Спасибо, в любом случае!

Другие вопросы по тегам