2017-02-16 43 views
0

我有一个火花数据框与列A,B,C,D所有类型双。我需要添加一个新列“比”将被计算如下:在Scala的NULL比较udf

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 

这怎么能在斯卡拉为Double做不能用NULL进行比较?

回答

2

有两种方法可以做到这一点。

首先是定义你的UDF的参数是java.lang.Double中,而不是双

这将使写UDF简单,但它很可能是双原始和慢之间由于装箱和拆箱java util双对象。

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

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

基本上用的是保存为如果,否则是一样的人。 $“a”.isNull检查列a的值是否为空,isNotNull是否检查它是否为空。点亮(N)为所有元素赋予N,您可以使用$“a”/ $“b”来计算a和b列中的值之间的比率