Ich versuche, eine UDF zu schreiben, die ich auf Hive-Tabellen in einem SQL-Context verwenden möchte. Ist es in irgendeiner Weise möglich, Objekte aus anderen Bibliotheken, die nicht serialisierbar sind, einzubeziehen? Hier ist ein minimales Beispiel dafür, was nicht funktioniert:Erstellen Sie SparkSQL-UDF mit nicht serialisierbaren Objekten
def myUDF(s: String) = {
import sun.misc.BASE64Encoder
val coder= new BASE64Encoder
val encoded= decoder.encode(s)
encoded
}
ich registrieren, um die Funktion in den Funken Shell als UDF-Funktion
val encoding = sqlContext.udf.register("encoder", myUDF)
Wenn ich versuche es auf einen Tisch „test“ zu laufen
sqlContext.sql("SELECT encoder(colname) from test").show()
ich erhalte den Fehler
org.apache.spark.SparkException: Task not serializable
object not serializable (class: sun.misc.BASE64Encoder, value: [email protected])
Gibt es einen Workaround dafür? Ich habe versucht, myUDF in ein Objekt und in eine Klasse einzubetten, aber das hat auch nicht funktioniert.
danke, Ihre Lösung funktioniert auch, aber später erkannte ich, dass mein Problem schlecht gestellt war und dass ich es auch funktionierte. – Harpe
@Harpe, ja dein Weg ist auch richtig :) danke für die Verbesserung :) Du kannst es akzeptieren wenn du willst;) –
Dieser Code wird auch ein neues 'BASE64Encoder' Objekt für jede einzelne Zeile instanziieren, oder? Das könnte in Ihrer Anwendung in Ordnung sein, hat aber potenzielle Auswirkungen auf die Leistung. Ich kämpfe mit einem ähnlichen Problem. – santon