我想取每个值的对数减去列中的最小元素。例如,如果 a 有类似这样的列:
成绩: 1000,500, 1200, 300
然后我想要:
logged_score: 日志(700(, 日志(200(, 日志(900(, 日志(0(
我在 Spark 数据框中尝试过这个:
.select(log($"score" - min($"score")).alias("logged_score"))
但是我得到了这个错误:
线程"main"中的异常 org.apache.spark.sql.AnalysisException: 分组表达式序列为空,并且 '
score
' 不是 聚合函数。Wrap '(LOG((score
- min(score
((( ASlogged_score
(' 在窗口函数中或将 'score
' 换入 first(((或first_value(如果你不在乎你得到哪个值。
解决此问题的最简单方法是在获取日志值之前通过收集min($"score")
来获取。但是,如果有更好的解决方案,我试图避免在这里进行收集。
您可以简单地执行以下操作
import org.apache.spark.sql.functions._
val minimumValue = df.select(min("score")).first()(0)
df.withColumn("logged_score", log($"score" - lit(minimumValue))).na.fill(0).show()