it-roy-ru.com

Как зарегистрировать UDF для использования в SQL и DataFrame?

Из того, что я видел, чтобы сделать это, вы должны 

  1. сделать udf простой функцией
  2. зарегистрируйте функцию с помощью SQLContext для SQL 

    spark.sqlContext.udf.register("myUDF", myFunc)
    
  3. превратить это в UserDefinedFunction для DataFrame

    def myUDF = udf(myFunc)
    

Нет ли способа объединить это в один шаг и сделать udf доступным для обоих? Кроме того, для случаев, когда функция существует для DataFrame, но не для SQL, как вы можете зарегистрировать ее без повторного копирования кода?

5
ninja

Варианты UDFRegistration.register, которые принимают scala.FunctionN, возвращают UserDefinedFunction, чтобы вы могли зарегистрировать функцию SQL и создать дружественный DSL UDF за один шаг:

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

Вы можете использовать следующее и по-прежнему применять его на данных

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

Используйте selectExpr при вызове его для преобразований данных.

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