Здесь я пытаюсь добиться условно сгенерированной в Spark функции SQL map
в зависимости от того, имеют ли они null
, 0
или любое другое значение, которое я могу захотеть.
Возьмем, к примеру, этот начальный DF.
val initialDF = Seq(
("a", "b", 1),
("a", "b", null),
("a", null, 0)
).toDF("field1", "field2", "field3")
Из этого исходного DataFrame я хочу создать еще один столбец, который будет картой, как здесь.
initialDF.withColumn("thisMap", MY_FUNCTION)
Мой текущий подход к это, в основном, Seq[String]
в методе a flatMap
пар ключ-значение, которые получает метод Spark SQL, например:
def toMap(columns: String*): Column = {
map(
columns.flatMap(column => List(lit(column), col(column))): _*
)
}
Но тогда фильтрация становится Scala вещь и это довольно беспорядок.
То, что я хотел бы получить после обработки, было бы для каждой из этих строк следующим DataFrame.
val initialDF = Seq(
("a", "b", 1, Map("field1" -> "a", "field2" -> "b", "field3" -> 1)),
("a", "b", null, Map("field1" -> "a", "field2" -> "b")),
("a", null, 0, Map("field1" -> "a"))
)
.toDF("field1", "field2", "field3", "thisMap")
Мне было интересно, если это может достигается с помощью Column
API, который более интуитивно понятен с .isNull
или .equalTo
?