Solución:
No hay anidación aquí, por lo tanto no hay necesidad de otherwise
. Todo lo que necesitas está encadenado when
:
import spark.implicits._
when($"tc" isin ("a", "b"), "Y")
.when($"tc" === "a" && $"amt" >= 0, "N")
ELSE NULL
está implícito, por lo que puede omitirlo por completo.
El patrón que usa es más aplicable para folding
sobre una estructura de datos:
val cases = Seq(
($"tc" isin ("a", "b"), "Y"),
($"tc" === "a" && $"amt" >= 0, "N")
)
dónde when
– otherwise
naturalmente sigue el patrón de recursividad y null
proporciona el caso base.
cases.foldLeft(lit(null)) {
case (acc, (expr, value)) => when(expr, value).otherwise(acc)
}
Tenga en cuenta que es imposible alcanzar el resultado “N” con esta cadena de condiciones. Si tc
es igual a “a” será capturado por la primera cláusula. Si no es así, no podrá satisfacer ambos predicados y, por defecto, NULL
. Deberías preferir:
when($"tc" === "a" && $"amt" >= 0, "N")
.when($"tc" isin ("a", "b"), "Y")
Para una lógica más compleja, prefiero usar UDF para una mejor legibilidad:
val selectCase = udf((tc: String, amt: String) =>
if (Seq("a", "b").contains(tc)) "Y"
else if (tc == "a" && amt.toInt <= 0) "N"
else null
)
dataset1.withColumn("REASON", selectCase(col("tc"), col("amt")))
.show
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)