Spark DataFrame,如何聚合列序列?

时间:2018-07-03 09:13:46

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

我有一个数据框,并且可以使用静态列名称进行聚合,即:

df.groupBy("_c0", "_c1", "_c2", "_c3", "_c4").agg(
concat_ws(",", collect_list("_c5")),
concat_ws(",", collect_list("_c6")))

它工作正常,但是如果我得到groupby列的序列和聚合列的序列怎么办?

换句话说,如果我有

val toGroupBy = Seq("_c0", "_c1", "_c2", "_c3", "_c4")
val toAggregate = Seq("_c5", "_c6")

并要执行以上操作?

1 个答案:

答案 0 :(得分:0)

要使用序列执行相同的groupBy和汇总,您可以执行以下操作:

val aggCols = toAggregate.map(c => expr(s"""concat_ws(",", collect_list($c))"""))
df.groupBy(toGroupBy.head, toGroupBy.tail:_*).agg(aggCols.head, aggCols.tail:_*)

expr函数采用一个表达式并将其求值到列中。然后将groupByagg的varargs变体应用于列列表。