Если у меня есть столбец карты искры от строки к двойному, легко ли сгенерировать новый столбец с ключом, соответствующим максимальному значению?
Я смог добиться этого, используя функции сбора, как показано ниже:
import org.apache.spark.sql.functions._
val mockedDf = Seq(1, 2, 3)
.toDF("id")
.withColumn("optimized_probabilities_map", typedLit(Map("foo"->0.34333337, "bar"->0.23)))
val df = mockedDf
.withColumn("optimizer_probabilities", map_values($"optimized_probabilities_map"))
.withColumn("max_probability", array_max($"optimizer_probabilities"))
.withColumn("max_position", array_position($"optimizer_probabilities", $"max_probability"))
.withColumn("optimizer_ruler_names", map_keys($"optimized_probabilities_map"))
.withColumn("optimizer_ruler_name", $"optimizer_ruler_names"( $"max_position"))
Однако это решение неоправданно долго и не очень эффективно. Существует также возможная проблема точности, так как я сравниваю удвоения при использовании array_position
. Интересно, есть ли лучший способ сделать это без UDF, возможно, используя строку выражения.