如何使用反射从Scala调用Spark UDF?

时间:2019-06-18 16:27:31

标签: java scala apache-spark reflection

我正在构建一个依赖于Java库的Spark应用程序。公开的Java接口为

String doSomething(String, Map<String,String>)

我创建的UDF为

def myfunc(properties: Map[String, String]) = udf((data: String) => {
    ...
    doSomething(data,properties)
})

可以从Spark Shell将该函数称为myfunc(properties)(data),其中属性是Map,数据的类型是Column。

问题是我需要通过scala文件中的反射来调用它。我需要做这样的事情:

val c = Class.forName("package.class")
val m = c.getMethod("myfunc",classOf[Map[String,String]])
m.invoke(c.newInstance, someMap)

m.invoke返回函数本身。如何以及在哪里传递Column参数?还是有其他方法可以将这些属性映射传递给spark UDF,以便可以通过反射直接调用它?

1 个答案:

答案 0 :(得分:0)

尝试

m.invoke(c.newInstance, someMap).asInstanceOf[UserDefinedFunction].apply(data)

对于类型data的{​​{1}}。