Saltar al contenido

Caso de Spark Dataframe anidado cuando declaración

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 whenotherwise 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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *