web-dev-qa-db-de.com

Wie registriere ich UDF für die Verwendung in SQL und DataFrame?

Nach allem, was ich gesehen habe, muss man das tun

  1. machen Sie die udf als einfache Funktion
  2. registrieren Sie die Funktion mit SQLContext für SQL

    spark.sqlContext.udf.register("myUDF", myFunc)
    
  3. verwandle dies in eine UserDefinedFunction für DataFrame

    def myUDF = udf(myFunc)
    

Gibt es keine Möglichkeit, dies in einem Schritt zu kombinieren und die udf für beide verfügbar zu machen? Wie können Sie eine Funktion für DataFrame, aber nicht für SQL registrieren, ohne den Code erneut zu kopieren?

5
ninja

UDFRegistration.register-Varianten, die einen scala.FunctionN annehmen, geben eine UserDefinedFunction zurück, sodass Sie die SQL-Funktion registrieren und eine DSL-freundliche UDF in einem einzigen Schritt erstellen können:

val timesTwoUDF = spark.udf.register("timesTwo", (x: Int) => x * 2)
spark.sql("SELECT timesTwo(1)").show
+---------------+
|UDF:timesTwo(1)|
+---------------+
|              2|
+---------------+
spark.range(1, 2).toDF("x").select(timesTwoUDF($"x")).show
+------+
|UDF(x)|
+------+
|     2|
+------+
12
user6910411

Sie können Folgendes verwenden und es dennoch auf Datenrahmen anwenden

spark.sqlContext.udf.register("myUDF", myFunc)

Verwenden Sie selectExpr, wenn Sie es für Dataframe-Transformationen aufrufen.

df.selectExpr("myUDF(col1) as modified_col1")
2
dansuzuki