2016-09-08 64 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