2017-02-08 22 views
0

Ich habe ein paar UDFs, die ich gerne als Funktion Argument zusammen mit Datenrahmen weitergeben würde.Spark UDF als Funktionsparameter, UDF ist nicht im Funktionsumfang

Eine Möglichkeit, dies zu tun, könnte sein, die UDF innerhalb der Funktion zu erstellen, aber das würde mehrere Instanzen der UDF erstellen und zerstören, ohne sie wiederzuverwenden, was möglicherweise nicht der beste Weg ist, dieses Problem anzugehen.

Hier ist ein Beispiel Stück Code -

val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} 

val df = inputDF1 
    .withColumn("new_col", lkpUDF(col("c1"))) 
val df2 = inputDF2. 
    .withColumn("new_col", lkpUDF(col("c1"))) 

Statt die oben zu tun, würde ich im Idealfall so etwas wie dies tun wollen -

val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} 

def appendCols(df: DataFrame, lkpUDF: ?): DataFrame = { 

    df 
     .withColumn("new_col", lkpUDF(col("c1"))) 

    } 
val df = appendCols(inputDF, lkpUDF) 

Die obige UDF ist ziemlich einfach, aber In meinem Fall kann es einen primitiven Typ oder einen benutzerdefinierten Fallklassentyp zurückgeben. Irgendwelche Gedanken/Hinweise würden sehr geschätzt werden. Vielen Dank.

Antwort

3

Ihre Funktion mit der entsprechenden Signatur muss dies sein: initialisiert

import org.apache.spark.sql.UserDefinedFunction 

def appendCols(df: DataFrame, func: UserDefinedFunction): DataFrame = { 
    df.withColumn("new_col", func(col("col1"))) 
} 

SCALA REPL ist sehr hilfreich bei der Rückkehr der Art des Wertes.

scala> val lkpUDF = udf{(i: Int) => if (i > 0) 1 else 0} 
lkpUDF: org.apache.spark.sql.UserDefinedFunction = UserDefinedFunction(<function1>,IntegerType,List(IntegerType)) 

Auch wenn die Signatur der Funktion, die Sie in die udf Wrapper übergeben einen Any Rückgabetyp besteht (was der Fall sein wird, wenn die Funktion entweder einen primitiven oder einen benutzerdefinierten Fallklasse zurückkehren kann), die UDF wird nicht mit einer Ausnahme wie folgt kompilieren:

java.lang.UnsupportedOperationException: Schema for type Any is not supported 
+0

Dank septra. Sie haben Recht, dass ich den obigen Fehler gefunden habe. Aber ich scheine diesen Fehler zu treffen, selbst wenn ich versuche, nur eine Fallklasse zurückzugeben. http://stackoverflow.com/questions/42121649/schema-for-type-any-is-not-supported – Yash