2016-04-10 3 views
1

Я пытаюсь избежать деления на ноль в этом расчете (ценностно (средний/STDDEV)Спарк Scala dataframe разделение и 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 в коде это лестницу не работает:

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

ответ

3

Вы можете coalesce:

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)), ...) 
Смежные вопросы