我们有一个早先在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。
答案 0 :(得分:2)
您需要自定义课程Writable
和Serializable
。 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()
}