创建一个简单的ifElse泛型UDF,它适用于DataFrame接受的所有数据类型。 Scala,Spark

时间:2016-10-24 09:19:39

标签: scala apache-spark dataframe

所以,我们得到了这样的函数:

def ifThenDoubleFuncion = (cond: Boolean, eIf: Double, eElse: Double) => if(cond) eIf else eElse

def ifThenUdf = udf(ifThenDoubleFuncion)

我希望此函数接受Spark DataFrame所提供的所有数据类型,所以我尝试了这个:

def ifThenFuncion[T <: AnyVal](cond: Boolean, eIf: T, eElse: T) => if(cond) eIf                   else eElse

但它会引发错误,因为DataFrame无法处理AnyVal对象。

由于性能原因,我不想使用模式匹配。我认为有一种优雅的方法可以解决这个问题。

提前致谢!!

1 个答案:

答案 0 :(得分:0)

在这里使用AnyVal或泛型是否有特定原因? 如果类型本身不重要,为什么不使用任何类型:

def ifThenDoubleFuncion = (cond: Boolean, eIf: Any, eElse: Any) => if(cond) eIf else eElse

<强> UPD

对不起啊。那里需要TypeTag。所以:

def ifThenDoubleFuncion[T: TypeTag](cond: Boolean, eIf: T, eElse: T): T = if(cond) eIf else eElse
udf { ifThenDoubleFuncion }

<: AnyVal为类型T提供了不必要的限制。