D'après ce que j'ai vu, pour faire cela, vous devez
udf
une fonction simpleenregistrer la fonction avec SQLContext
pour SQL
spark.sqlContext.udf.register("myUDF", myFunc)
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?
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|
+------+
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")