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-如何以多列作为参数调用UDF

如何将复杂的 Java 类对象作为参数传递给 Spark 中的 Scala UDF?

如何使用 Java UDF 向 Spark 数据框添加新列

Spark-源码-TaskScheduler初始化过程, ClientActor向Master发送注册任务信息过程

如何在 Spark Databricks 中注册 SQL 函数

centos7无cm安装hadoop+spark