2016-04-10 10 views
1

場合、私はこれは私が思い付いたものです値 - (/ STDDEV平均)スパークScalaのデータフレーム部門と

(この計算では、ゼロ除算を避けるためにしようとしています:

%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 

二つの質問 - より良い方法 - 私は分裂を使用することができますし、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構文:

when($"sd" === 0, $"a2"/lit(c)).otherwise($"a2"/$"sd") 

CASE sd 
    WHEN 0 THEN a2/0.00000001 
    ELSE a2/sd 
END 
あなたの目標は、その後スケーリング0をデフォルトがより理にかなって維持される場合が。

0

私は次の形式をよりコンパクトに見つかりました

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