Dire que j'ai l'objet Java suivante qui correspond à Jackson données complètes de liaison:NotSerializableException pour Jackson ObjectNode en cause de fermeture Spark
public class Student implements Serializable{
private ObjectNode name; // two keys: "first_name", "last_name"
// getter and setter ...
}
Et j'ai un code suivant Spark qui tente de sérialiser la variable de fermeture student
de type Student
en raison de portées différentes.
class A(student : Student) extends Serializable {
def process(input: DataFrame): Unit = {
val test = input.map { a =>
print(student)
}
}
}
qui donne l'erreur suivante: Caused by: java.io.NotSerializableException: com.fasterxml.jackson.databind.node.ObjectNode
Je comprends pourquoi je reçois une telle erreur. Fondamentalement, Spark tentera de sérialiser toutes les fermetures hors-champ et fermera le tout à chaque exécuteur. Mais puisque le ObjectNode lui-même n'est pas Serializable
, l'exécuteur ne peut pas obtenir les instances Student
. Ma question est, quelles sont les façons dont je peux résoudre ce problème?
J'ai essayé d'utiliser Map<String, String>
au lieu de ObjectNode
, mais depuis ObjectNode
« s put
et set
ne peut avoir des « primitifs » et JsonNode
en tant que valeur, il provoque une erreur lorsque je tente quelque chose comme ceci:
ObjectNode meta_info = JsonNodeFactory.instance.objectNode();
meta_info.set("field name", student.getName());