Похоже, вы смешали функции udf
и Spark, вам нужно использовать только одну из них. Когда это возможно, всегда предпочтительнее использовать , а не , а udf
, поскольку они не могут быть оптимизированы (и, следовательно, обычно медленнее). Без udf
это можно сделать следующим образом:
df.withColumn("end", when($"termEnd".isNull, $"agrEnd").otherwise($"termEnd"))
.withColumn("expired", when(abs(datediff($"end", $"BCED")) lt 6, 0).otherwise(1))
Я ввел временный столбец, чтобы сделать код немного более читабельным.
Используя udf
, это можно сделать, например, следующим образом:
val isExpired = udf((a: Date, b: Date) => {
if ((math.abs(a.getTime() - b.getTime()) / (1000 * 3600 * 24)) < 6) {
0
} else {
1
}
})
df.withColumn("end", when($"termEnd".isNull, $"agrEnd").otherwise($"termEnd"))
.withColumn("expired", isExpired($"end", $"BCED"))
Здесь я снова использовал временный столбец, но эту логику можно перенести в udf
, если хотите.