【问题标题】:How to calculate total across columns but one?如何计算除一列之外的总和?
【发布时间】:2017-09-27 15:33:23
【问题描述】:

我想在数据框中创建一个“总计”行。

这将添加除 uid 单元格之外的所有行。

uid  val1 val2 val3 
3213 1    2    3

创建这个:

uid  val1 val2 val3 Total
3213 1    2    3     6

所以,我需要过滤掉 UID,然后求和。但是,如果我在求和之前删除 UID,那么在求和之后我将无法重新加入表(因为加入必须在 UID 上)。

我在玩过滤器,但我找不到在过滤器中获取列名的方法。

所以我到目前为止是:

   val dfvReducedTotalled = dfvReduced.withColumn("TOTAL", dfvReduced.columns
  .filter(col=> !col.?????? == "UID")
  .map(c => col(c)).reduce((c1, c2) => c1 + c2))

【问题讨论】:

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


    【解决方案1】:

    您可以先收集不是uid的列名,使用reduce构建sum表达式,然后创建Total列:

    val row_sum_expr = df.columns.collect{ case x if x != "uid" => col(x) }.reduce(_ + _)
    df.withColumn("Total", row_sum_expr).show
    +----+----+----+----+-----+
    | uid|val1|val2|val3|Total|
    +----+----+----+----+-----+
    |3213|   1|   2|   3|    6|
    +----+----+----+----+-----+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-07
      • 1970-01-01
      • 1970-01-01
      • 2014-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多