1

Ich versuche, eine Tabelle in Databricks Community Edition mit dem folgenden Code zu registrieren:überladene Methode Wert UDF mit Alternativen

import org.apache.spark.sql.functions.udf 

val getDataUDF(url: String):Unit = udf(getData(url: String):Unit) 

Allerdings bekomme ich einen Fehler:

overloaded method value udf with alternatives:

Antwort

1

Ihre UDF Syntax aussieht ein bisschen seltsam, sollten Sie nicht den Typ definieren, wenn Sie getData() aufrufen. Außerdem sollte die Eingabe für die benutzerdefinierte Funktion in der Methode selbst enthalten sein.

Zum Beispiel haben Sie eine Methode getData wie folgt aus (es einen Rückgabewert haben sollte):

def getData(url: String): String = {...} 

Um es in ein UDF zu machen, gibt es zwei Möglichkeiten:

  1. Rewrite getData als Funktion

    val getData: (String => String) = {...} 
    val getDataUDF = udf(getData) 
    
  2. Rufen Sie die getData Verfahren innerhalb des UDF

    val getDataUDF = udf((url: String) => { 
        getData(url) 
    }) 
    

Beide Wege funktionieren sollte, ich persönlich denke, Methode 1 etwas besser aussieht.

+1

Ich würde vorschlagen, "val getData" in Methode 1 definieren (d. H. Eine Funktion definieren). Sie definieren eine Methode, die eine Funktion zurückgibt. Aber diese Funktion ist immer die gleiche, so dass ich 'def' nicht verwenden muss. –

+0

@RaphaelRoth Das ist ein gültiger Punkt. Ich habe die Antwort geändert, um dies zu reflektieren. – Shaido

+0

DANKE. Aber ... ich glaube, das Problem, das ich hatte, war, dass wir nicht die gleiche Unterschrift in der Def als in der Registrierung verwenden können. val getDataUDF (url: String): Einheit = udf (getData (url: String): Unit) SOLLTE STATT WERDEN val getDataUDF (url: String): Einheit = udf (getData (_: String): Einheit) ABER JETZT BEHOBELTE ich DIESER FEHLER ERHALTE ICH EINE AUSNAHME java.lang.UnsupportedOperationException: Schema für den Typ Einheit wird nicht unterstützt, was ich jetzt untersuchen werde. DANKE NOCH EINMAL. – user3439308

Verwandte Themen