Spark中的序列文件 - 读写自定义

时间:2015-09-30 03:46:39

标签: java scala hadoop apache-spark

我们有一个早先在Hadoop上构建的数据管道。但现在我们正在尝试将一些应用程序移植到Spark。

在我们的数据管道中,我们使用序列文件作为每个阶段的OP,并将其传递到下一阶段。 因此,已经为Hadoop编写了自定义类,它们实现了可写入接口来存储这些数据。

如果我试图通过创建该类的对象并将其保存为序列文件而在Spark中使用它,我会收到类似

的错误

Text / IntWritable或任何其他可写类不可序列化。 有没有办法使用这些自定义类在Spark中保存序列文件。

该类已经存在于Java中,我不想修改它们 示例示例

public class Abc implements Writable,Serializable{
    private Text requestId;
    private Text requestType;

    //Constructor and other methods
    @Override
    public void write(DataOutput out) throws IOException {
        requestId.write(out);
        requestType.write(out);
    }

    @Override
    public void readFields(DataInput in) throws IOException {
        requestId.readFields(in);
        requestType.readFields(in);
    }
}

它给出了一个错误,因为Text对象不是Serializable。

1 个答案:

答案 0 :(得分:2)

您需要自定义课程WritableSerializable。 E.g。

class MyText(var string: String) extends Writable with Serializable {

  def this() = this("Empty")

  override def write(out: DataOutput): Unit = {
    Text.writeString(out, string)
  }

  override def readFields(in: DataInput) : Unit = {
    string = Text.readString(in)
  }
}

如果可能的话,我会离开序列文件,然后切换到Parquet。您可以看到序列文件的问题,特别是对于Scala,其中读取序列文件不是不可变的,您可以为集合中的所有对象获取相同的值。 See this JIRA ticket.

如果您有一个已经实现Writable的Java类,您可以尝试创建一个继承自该自定义类并实现Serializable的新类。 E.g。

class MyWritableAndSerializable extends MyCustomJavaWritable with Serializable {

    def this() = super.this()

}