2017-06-27 2 views
0

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.

Antwort

1

können Sie versuchen, die Definition udf Funktion als

def encoder = udf((s: String) => { 
    import sun.misc.BASE64Encoder 
    val coder= new BASE64Encoder 
    val encoded= coder.encode(s.getBytes("UTF-8")) 
    encoded 
}) 

und rufen Sie die udf Funktion als

dataframe.withColumn("encoded", encoder(col("id"))).show 

Aktualisiert

Wie @santon klargestellt hat, dass BASE64Encoder Encoder für eingeleitet jede Zeile im Datenrahmen, was zu Leistungsproblemen führen kann. Die Lösung dazu wäre, ein statisches ObjektBASE64Encoder zu erstellen und es innerhalb udf Funktion zu benennen.

+0

danke, Ihre Lösung funktioniert auch, aber später erkannte ich, dass mein Problem schlecht gestellt war und dass ich es auch funktionierte. – Harpe

+0

@Harpe, ja dein Weg ist auch richtig :) danke für die Verbesserung :) Du kannst es akzeptieren wenn du willst;) –

+0

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

Verwandte Themen