【发布时间】:2017-01-22 19:53:41
【问题描述】:
假设我有以下映射到 Jackson 完整数据绑定的 Java 对象:
public class Student implements Serializable{
private ObjectNode name; // two keys: "first_name", "last_name"
// getter and setter ...
}
我有一个以下 Spark 代码,由于作用域不同,它尝试序列化 Student 类型的闭包变量 student。
class A(student : Student) extends Serializable {
def process(input: DataFrame): Unit = {
val test = input.map { a =>
print(student)
}
}
}
给出以下错误:Caused by: java.io.NotSerializableException: com.fasterxml.jackson.databind.node.ObjectNode
我明白为什么我会收到这样的错误。基本上,Spark 将尝试序列化所有超出范围的变量,也就是闭包,并将其传递给每个执行程序。但是由于ObjectNode本身不是Serializable,所以executor无法获取Student的实例。
我的问题是,有什么方法可以解决这个问题?
我曾尝试使用Map<String, String> 而不是ObjectNode,但由于ObjectNode 的put 和set 只能将“原始”和JsonNode 作为值,因此当我尝试某些操作时会导致错误像这样:
ObjectNode meta_info = JsonNodeFactory.instance.objectNode();
meta_info.set("field name", student.getName());
【问题讨论】:
标签: java json scala jackson serializable