web-dev-qa-db-fra.com

Comment enregistrer UDF à utiliser dans SQL et DataFrame?

D'après ce que j'ai vu, pour faire cela, vous devez

  1. faire de la udf une fonction simple
  2. enregistrer la fonction avec SQLContext pour SQL

    spark.sqlContext.udf.register("myUDF", myFunc)
    
  3. transformez-la en UserDefinedFunction pour DataFrame

    def myUDF = udf(myFunc)
    

N'y a-t-il aucun moyen de combiner cela en une seule étape et de rendre la udf disponible pour les deux? De même, dans les cas où une fonction existe pour DataFrame mais pas pour SQL, comment vous enregistrez-vous sans la copier à nouveau sur le code?

5
ninja

Les variantes UDFRegistration.register, qui prennent un scala.FunctionN, renvoient une UserDefinedFunction afin que vous puissiez enregistrer la fonction SQL et créer une UDF compatible avec DSL en une seule étape:

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

Vous pouvez utiliser les éléments suivants tout en les appliquant sur la structure de données.

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

Utilisez selectExpr lorsque vous l’appelez lors de la transformation de la structure de données.

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