Вы можете сделать это:
val newDF = oldDF.select(col("id"), col("persona_model")("Tech")("score").as("temp"))
, тогда вы можете легко извлечь temp значений.
update : если у вас большеодин ключ, тогда процедура немного сложнее.
сначала создайте класс для структуры (необходимо для приведения типа):
case class Score(score: Double, tag: String)
, а затем извлеките все ключи из данных:
val keys = oldDF.rdd
.flatMap(r => r.getMap(1).asInstanceOf[Map[String, Score]].toList)
.collect.map(_._1).distinct.toList
наконец, вы можете извлечь все имена, как это:
def condition(keys: List[String]): Column = {
keys match {
case k::ks => when(col("persona_model")(k)("score").isNotNull, col("persona_model")(k)("score")).otherwise(condition(ks))
case nil => lit(null)
}
}
val newDF = oldDF.select(col("id"), condition(keys))