我们有一个在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);
}
}
它作为文本对象给出错误是不可序列化的。
1条答案
按热度按时间5jvtdoz21#
你将需要使你的自定义类都
Writable
以及Serializable
. 例如如果可能的话,我会从序列文件转移到parquet,例如。您可以看到序列文件的问题,特别是scala,在scala中,读取时序列文件不是不可变的,并且可以为collect中的所有对象获得相同的值。看看这张吉拉的票。
如果您有一个已经实现的java类
Writable
您可以尝试创建一个从该自定义类继承并实现的新类Serializable
. 例如