java - Java代码如何向Spark注册无参数UDF

标签 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);
	}
}

  • 问题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/

相关文章:

mysql - 在 Mac OSX 上安装 MySQL libmysqlclient-dev 和 UDF 文件

java - 保存到 Oracle 表时 Blob 被截断

java - 自定义测试结果监听器

apache-spark - 分组以将 hive 中的多列值合并为一列

java - apache spark 中类(任务对象)的 kryo 序列化在反序列化时返回 null

scala - 不支持 Any 类型的架构

java - 处理java RMI连接拒绝主机异常

java - 从编译的类文件中设置一个新项目 intellij IDEA

scala - Spark 3.0 读取 json 文件比 Spark 2.4 慢得多

hadoop - pig udf中是否有类似setup的功能