2013-03-07 4 views
1

Я использую пользовательские типы данных в Hadoop. Вот мой код:EOF Исключение при использовании пользовательских данных Hadoop

Пользовательские данные Тип:

public class TwitterData implements Writable { 

private Long id; 
private String text; 
private Long createdAt; 

public TwitterData(Long id, String text, Long createdAt) { 
    super(); 
    this.id = id; 
    this.text = text; 
    this.createdAt = createdAt; 
} 

public TwitterData() { 
    this(new Long(0L), new String(), new Long(0L)); 
} 

@Override 
public void readFields(DataInput in) throws IOException { 
    System.out.println("In readFields..."); 
    id = in.readLong(); 
    text = in.readLine(); 
    createdAt = in.readLong(); 
} 

@Override 
public void write(DataOutput out) throws IOException { 
    System.out.println("In write..."); 
    out.writeLong(id); 
    out.writeChars(text); 
    out.writeLong(createdAt); 
} 

public Long getId() { 
    return id; 
} 

public void setId(Long id) { 
    this.id = id; 
} 

public String getText() { 
    return text; 
} 

public void setText(String text) { 
    this.text = text; 
} 

public Long getCreatedAt() { 
    return createdAt; 
} 

public void setCreatedAt(Long createdAt) { 
    this.createdAt = createdAt; 
} 
} 

Mapper:

public class Map extends Mapper<Object, BSONObject, Text, TwitterData>{ 

@Override 
public void map(Object key, BSONObject value, Context context) throws IOException, InterruptedException { 
    BSONObject user = (BSONObject) value.get("user"); 
    String location = (String) user.get("location"); 

    TwitterData twitterData = new TwitterData((Long) value.get("id"), 
      (String) value.get("text"), (Long) value.get("createdAt")); 

    if(location.toLowerCase().indexOf("india") != -1) { 
     context.write(new Text("India"), twitterData); 
    } else { 
     context.write(new Text("Other"), twitterData); 
    } 
} 
} 

Главная Работа Код:

job.setMapOutputKeyClass(Text.class); 
job.setMapOutputValueClass(TwitterData.class); 

Я бросает это исключение после процесса сопоставления. Я сосать, почему он показывает эту ошибку. Кто-нибудь может мне помочь, пожалуйста. Спасибо заранее.

ответ

2

Вы пишете символы, и вы читаете строки. Это два разных процесса сериализации.

Что вам нужно сделать, это делает:

@Override 
public void readFields(DataInput in) throws IOException { 
    id = in.readLong(); 
    text = in.readUTF(); 
    createdAt = in.readLong(); 
} 

@Override 
public void write(DataOutput out) throws IOException { 
    out.writeLong(id); 
    out.writeUTF(text); 
    out.writeLong(createdAt); 
} 
+0

спасибо Томас. Я работал на меня. Итак, каково использование readLine(), когда у нас нет writeLine()? Аналогично для writeChars() .. –

+0

@AbhendraSingh, когда вы читаете из текстового файла и читаете строку за строкой, например. Написание строки будет писать UTF + '\ n'. –

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