我有一组 API,因此可以定义不同的 UDF 来使用。如:
import scala.Function0;
class UDF0 {
private String targetField;
private Function0 function0;
}
import scala.runtime.AbstractFunction0;
udf0.setFunction0(new AbstractFunction0<String>() {
@Override
public String apply() {
return "IA";
}
})
class UDF0Parser implement Parser<UDF0> {
public void parse(UDF0 udf0) {
String udfName = "udf0";
getSparkSession().udf().register(udfName, ()-> udf0.getFunction0().apply(), ???);
Column col = functions.callUDF(udfName);
getDateSet().withColumn("newCol", col);
}
}
- 问题1
如何在 Java 中获取 scala String TypeTag(位置???,第三个参数)?
我转而使用scala编写UDF0Parser:
class UDF0Parser implement Parser<UDF0> {
def parse(udf0: UDF0): Unit = {
val udfName = "udf0"
getSparkSession.udf.register(udfName, udf0.getFunction0)
val col = functions.callUDF(udfName)
getDateSet.withColumn("new", col)
}
}
但是我遇到了运行时错误:
Error:(14, 65) type mismatch;
found : Function0
required: () => ?
stepContext.getSparkSession.udf.register(udfName, transform.getFunction0);
^
- 问题2
()->xxx 不就是 Function0 的一个实例吗?我该怎么办?
感谢任何帮助。
最佳答案
我自己找到了一个解决方案,将整行作为参数传递给UDF,而不需要为一列或多列编写UDF。 请参阅:How to pass whole Row to UDF - Spark DataFrame filter
关于java - Java代码如何向Spark注册无参数UDF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41734348/