Spark Получить имя udf из столбца и выполнить его - PullRequest
3 голосов
/ 08 октября 2019

Я зарегистрировал некоторые udf, у всех одинаковые типы входных параметров и одинаковый тип вывода (String). Допустим, udf1, udf2, udf3. Все они имеют разные функции.

В моем наборе данных у меня есть несколько столбцов, в одном столбце у меня есть имя файла udf, который я хочу выполнить в этой строке данных.

Пример набора данных:

+---+-------+-------+
|A  |   B   |udf    |
+---+-------+-------+
|1  |   a   |udf1   |
|2  |   b   |udf2   |
|3  |   c   |udf3   |
+---+-------+-------+

Я хочу сделать что-то вроде этого:

ds.withColumn("TEST", functions.callUDF(<name of right udf>, col("A"), col("B"))

Как мне этого добиться? Возможно ли это, а если нет, каков обходной путь?

Справочная информация: В моем задании Spark есть набор пользовательских функций, и я хочу динамически выполнить правильный udf для строки.

1 Ответ

1 голос
/ 09 октября 2019

Попробуйте это ::

def func1(y: Int, z: String): String = y+z
def func2(y: Int, z: String): String = y+","+z
def default(y: Int, z: String): String = y

val udfName = udf({ (x: String, y: Int, z: String) => x match {
case "func1" => func1(y,z)
case "func2" => func2(y,z)
case _ => default(y,z)
}})

val data = Seq((1,"a","func1"),
(2,"b","func2")
).toDF("A", "B", "udf")

data.withColumn("TEST", udfName(col("udf"), col("A"), col("B")))

Вы также можете использовать библиотеку исходного кода для более продвинутого способа обработки этого:

scala получить имя функции, которое было отправлено как параметр

...