Spark从列中获取udf名称并执行它

时间:2019-10-08 10:51:19

标签: java apache-spark apache-spark-sql

我注册了一些udf,它们都具有相同的输入参数类型和相同的输出类型(字符串)。 假设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,我想为该行动态执行正确的udf。

1 个答案:

答案 0 :(得分:1)

尝试一下::

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 get function name that was sent as param