【发布时间】:2020-01-09 03:18:37
【问题描述】:
如果我有一个从字符串到双精度的火花映射列,是否可以轻松生成一个新列,其键对应于最大值?
我能够使用如下所示的集合函数来实现它:
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 的情况下执行此操作,也许使用表达式字符串。
【问题讨论】:
标签: scala apache-spark apache-spark-sql