2016-09-08 60 views
1

我想使用列名称数组作为输入来聚合Spark数据框,并同时保留列的原始名称。使用列名称数组聚合Spark数据框,保留名称

df.groupBy($"id").sum(colNames:_*) 

这个工程,但未能保留名称。通过回答启发发现here我unsucessfully尝试这样做:

df.groupBy($"id").agg(sum(colNames:_*).alias(colNames:_*)) 
error: no `: _*' annotation allowed here 

它可以采取像

df.groupBy($"id").agg(sum(colNames(2)).alias(colNames(2))) 

单个元素如何才能做到这一点整个阵列?

回答

3

只需提供列的顺序与别名:

val colNames: Seq[String] = ??? 
val exprs = colNames.map(c => sum(c).alias(c)) 
df.groupBy($"id").agg(exprs.head, exprs.tail: _*) 
+0

是的,我猜会是这样的。但是,仍然无法实现它的工作。错误:没有':_ *'注释允许在这里 (这样的注释只允许在*参数的参数中) – johnblund

+0

对不起,它应该是agg和sum。 – zero323

+0

是的,我也发现colNames实际上应该是exprs,对吧? – johnblund