java序列文件在spark中的读写定制

bfhwhh0e  于 2021-05-29  发布在  Hadoop
关注(0)|答案(1)|浏览(360)

我们有一个在hadoop上构建的数据管道。但现在我们正在尝试将一些应用程序移植到spark。
在我们的数据管道中,我们使用序列文件作为每个阶段的操作,并将其传递给下一个阶段。因此,已经有为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);
    }
}

它作为文本对象给出错误是不可序列化的。

5jvtdoz2

5jvtdoz21#

你将需要使你的自定义类都 Writable 以及 Serializable . 例如

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,在scala中,读取时序列文件不是不可变的,并且可以为collect中的所有对象获得相同的值。看看这张吉拉的票。
如果您有一个已经实现的java类 Writable 您可以尝试创建一个从该自定义类继承并实现的新类 Serializable . 例如

class MyWritableAndSerializable extends MyCustomJavaWritable with Serializable {

    def this() = super.this()

}

相关问题