Java代码如何在Spark中注册无参数UDF

时间:2017-01-19 05:24:40

标签: java apache-spark udf

我有一组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);
	}
}
&#13;
&#13;
&#13;

  • 问题1

如何在Java中获取scala String TypeTag(position ???,第三个参数)?

我转而使用scala编写UDF0Parser:

&#13;
&#13;
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)
	}
}
&#13;
&#13;
&#13;

但是我遇到了运行时错误:

&#13;
&#13;
Error:(14, 65) type mismatch;
 found   : Function0
 required: () => ?
    stepContext.getSparkSession.udf.register(udfName, transform.getFunction0);
                                                                ^
&#13;
&#13;
&#13;

  • 问题2

Isn&#t; t() - &gt; xxx只是Function0的一个实例?我该怎么办?

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我自己找到了一个解决方案,将整行作为参数传递给UDF,而不需要为一个或多个列编写UDF。 请参阅:How to pass whole Row to UDF - Spark DataFrame filter

相关问题