2017-09-28 9 views
1

私の質問は簡単ですが、私は適切な解決策を見つけることができません。私はひどいコードでそれをハックすることができます、私はエレガントなものを見つけることを望みます。ここでスパークデータフレーム:グループ後の使用方法+合計

はコードの私のラインです:

val summedDF = dataFrame.groupBy(colsNamesGroupBy.head, colsNamesGroupBy.tail : _*).sum(colsNamesSum:_*) 

それは、列名の配列にGROUPBYを行い、その後、いくつかの列を合計します。

すべて正常に動作しますが、私は名前のついた列(sum(xxxx))を取得します。 私は外出先でこれらの名前を変更したいかもしれません。おそらくマップ操作で、 "xxxx"という名前だけを保持しています。

誰でも知っていますか?

EDIT:

私はそのような何かをしようとしているが、私は "この署名付きシンボルAGGを解決することはできません" を取得:

val summedDF = dataFrame.groupBy(colsNamesGroupBy.head, colsNamesGroupBy.tail : _*).agg(colsNamesSum.map(c => sum(c).as(c))) 
+0

あなたはこの回答を調べましたか?https://stackoverflow.com/questions/33882894/sparksql-apply-aggregate-functions-to-a-list-of-column –

答えて

1

私はそのような何かをしようとするだろう:

import org.apache.spark.sql.functions.{sum, col} 

val aggregateExpr = colsNamesSum.map(c => sum(col(c)).as(c)) 

val summedDF = dataFrame.groupBy(colsNamesGroupBy.head, colsNamesGroupBy.tail : _*).agg(aggregateExpr.head, aggregateExpr.tail: _*) 
+0

私は本当にこれを行うようにしたいと思いますそのようなものlution私が探しているのは –

+0

typeMismatch例外が発生する –

+0

申し訳ありませんが、最近、Spark 2.1.1に移行しました。そのため、.agg()メソッドにいくつか変更がありました。私は私の答えを編集します。 –

関連する問題