scala udf中的NULL比较

时间:2017-02-16 04:54:39

标签: scala apache-spark isnull

我有一个火花数据帧,列A,B,C,D都是double类型。我需要添加一个新列'比率'其计算方法如下:

if(A IS NULL && B IS NULL)
  then 0
if(A IS NOT NULL && B IS NULL)
  then A/D
if(A IS NULL && B IS NOT NULL)
  then C/B
if(A IS NOT NULL && B IS NOT NULL)
  then A/B

如何在scala中完成此操作,因为Double无法与NULL进行比较?

1 个答案:

答案 0 :(得分:2)

有两种方法可以做到。

首先是将你的udf参数定义为java.lang.Double而不是Double

这会使编写udf变得简单,但由于double原语和java util Double对象之间的装箱和拆箱,它可能会很慢。

更好的方法是根本不使用UDF。您可以使用数据框语义:

df.withColumn("newOne", when($"a".isNull && $"b".isNull, lit(0)).otherwise(when($"a".isNotNull && $"b".isNotNull, $"a"/$"d").otherwise(...))

基本上,with是保存为if,否则与else相同。 $" a" .isNull检查列a的值是否为null并且isNotNull检查它是否为空。 lit(N)为所有元素赋予N,你可以使用$" a" / $" b"计算a和b列中的值之间的比率