Java代码如何向Spark注册无参数UDF
Posted
技术标签:
【中文标题】Java代码如何向Spark注册无参数UDF【英文标题】:How Java code register none parameter UDF with Spark 【发布时间】:2017-01-19 05:24:40 【问题描述】:我有一组 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 的一个实例吗?我该怎么办?
感谢任何帮助。
【问题讨论】:
【参考方案1】:我自己找到了一个解决方案,将整行作为参数传递给 UDF,不需要为一列或多列编写 UDF。 见:How to pass whole Row to UDF - Spark DataFrame filter
【讨论】:
以上是关于Java代码如何向Spark注册无参数UDF的主要内容,如果未能解决你的问题,请参考以下文章
如何将复杂的 Java 类对象作为参数传递给 Spark 中的 Scala UDF?
Spark-源码-TaskScheduler初始化过程, ClientActor向Master发送注册任务信息过程