Java 使用Hadoop自定义数据类型时出现EOF异常

Java 使用Hadoop自定义数据类型时出现EOF异常,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我是第一次在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.

我是第一次在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;
}
}
制图员:

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);
    }
}
}
我在映射过程之后抛出这个异常。我不明白为什么它会显示这个错误。谁能帮帮我吗。
提前谢谢。

你写字符,你读行。这是两个不同的序列化过程

您需要做的是:

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

谢谢你,托马斯。我为我工作。那么,如果没有writeLine(),readLine()有什么用处呢?例如,当您从文本文件读取并逐行读取时,writeChars()..@AbhendraSingh的情况也类似。写一行就是写UTF+'\n'。
@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);
}