2016-04-10 93 views
1

我試圖避免被零除在此計算(值 - (平均/ STDDEV)星火斯卡拉據幀劃分和IF

這是我想出了:

%sql 
select id,cykle, 
s2-(a2/IF(sd2 == 0.0, 0.00000001, sd2)) as std2, 
s3-(a3/IF(sd3 == 0.0, 0.00000001, sd3)) as std3, 
s4-(a4/IF(sd4 == 0.0, 0.00000001, sd4)) as std4 
from XXX where id = 1 order by cykle 

兩個問題 - 更好的辦法 - 我可以使用部門和IF在Scala代碼,這並不工作:

($"s1" - ("$a1"/IF("$sd1" == lit(0.0),lit(0.00000001),"$sd1"))).as("std1") 

回答

3

您可以​​3210:

COALESCE(a2/sd, a2/0.00000001) 
val c: Double = ??? 
coalesce($"a2"/$"sd", $"a2"/lit(c)) 

或使用CASE ... WHEN結構:

CASE sd 
    WHEN 0 THEN a2/0.00000001 
    ELSE a2/sd 
END 
when($"sd" === 0, $"a2"/lit(c)).otherwise($"a2"/$"sd") 

但如果你的目標是縮放然後保持默認設置爲0會更有意義。

0

我發現下面的形式更加緊湊:

select(..., 'a2/coalesce('sd, lit(c)), ...)