我正在构建一个依赖于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,以便可以通过反射直接调用它?
答案 0 :(得分:0)
尝试
m.invoke(c.newInstance, someMap).asInstanceOf[UserDefinedFunction].apply(data)
对于类型data
的{{1}}。