如何计算除列之外的总数?

时间:2017-09-26 19:14:25

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

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

这将添加除了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))

1 个答案:

答案 0 :(得分:3)

您可以先收集非uid的列名,使用sum构建reduce个表达式,然后创建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|
+----+----+----+----+-----+