2017-02-16 5 views
0

У меня есть блок данных искры с колонками A, B, C, D, все типа double. Мне нужно, чтобы добавить новый столбец «отношение», которое должно быть вычислено, как показано ниже:Сравнение NULL в scala 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

Есть два способа сделать это.

Первый заключается в определении параметров вашего ОДС быть java.lang.Double вместо Double

Это сделало бы писать UDF простой, но это, вероятно, будет медленным из-за бокса и распаковка между двойной примитивно и java util Двойной объект.

Лучший способ - не использовать UDF вообще. Вы можете использовать dataframe семантику:

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

В основном с это сохранить как, если, в противном случае такое же как-то еще. $ "a" .isNull проверяет, имеет ли значение столбца a значение null и isNotNull проверяет, не является ли оно нулевым. lit (N) дает N всем элементам, и вы можете использовать $ "a"/$ "b" для вычисления отношения между значениями в столбцах a и b.