【发布时间】:2018-04-28 00:23:08
【问题描述】:
我正在寻找一种在 Scala 中的数据框中获取新列的方法,该列计算 col1、col2、...、col10 中的值的 min/max每一行。
我知道我可以使用 UDF 做到这一点,但也许有更简单的方法。
谢谢!
【问题讨论】:
标签: scala apache-spark apache-spark-sql
我正在寻找一种在 Scala 中的数据框中获取新列的方法,该列计算 col1、col2、...、col10 中的值的 min/max每一行。
我知道我可以使用 UDF 做到这一点,但也许有更简单的方法。
谢谢!
【问题讨论】:
标签: scala apache-spark apache-spark-sql
通过user6910411移植this Python answer
import org.apache.spark.sql.functions._
val df = Seq(
(1, 3, 0, 9, "a", "b", "c")
).toDF("col1", "col2", "col3", "col4", "col5", "col6", "Col7")
val cols = Seq("col1", "col2", "col3", "col4")
val rowMax = greatest(
cols map col: _*
).alias("max")
val rowMin = least(
cols map col: _*
).alias("min")
df.select($"*", rowMin, rowMax).show
// +----+----+----+----+----+----+----+---+---+
// |col1|col2|col3|col4|col5|col6|Col7|min|max|
// +----+----+----+----+----+----+----+---+---+
// | 1| 3| 0| 9| a| b| c|0.0|9.0|
// +----+----+----+----+----+----+----+---+---+
【讨论】:
Float? greatest(cols.map(col): _*).alias("max") 不应该足够吗?
null 的简单防护措施。如果一行中的任何值为 null,则比较运算符的计算结果为 null。如果我们合并到无穷大,我们可以解决这个问题。
null 的情况,但是根据API doc 应该可以解决这个问题:Returns the greatest value of the list of values, skipping null values.
least 和 greatest 会自动处理 null 值。我编辑了答案。