【问题标题】:Row aggregations in ScalaScala中的行聚合
【发布时间】:2018-04-28 00:23:08
【问题描述】:

我正在寻找一种在 Scala 中的数据框中获取新列的方法,该列计算 col1col2、...、col10 中的值的 min/max每一行。

我知道我可以使用 UDF 做到这一点,但也许有更简单的方法。

谢谢!

【问题讨论】:

    标签: scala apache-spark apache-spark-sql


    【解决方案1】:

    通过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|
    // +----+----+----+----+----+----+----+---+---+
    

    【讨论】:

    • 为什么要投射到Floatgreatest(cols.map(col): _*).alias("max") 不应该足够吗?
    • @LeoC 这是针对null 的简单防护措施。如果一行中的任何值为 null,则比较运算符的计算结果为 null。如果我们合并到无穷大,我们可以解决这个问题。
    • 我还没有测试过null 的情况,但是根据API doc 应该可以解决这个问题:Returns the greatest value of the list of values, skipping null values.
    • @Inna LeoC 指出,leastgreatest 会自动处理 null 值。我编辑了答案。
    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 2010-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    相关资源
    最近更新 更多