2016-09-29 150 views
6

如何重命名列名我有一個數據幀與配置的列名,例如火花SQL

Journey channelA channelB channelC 
j1  1  0  0 
j1  0  1  0 
j1  1  0  0 
j2  0  0  1 
j2  0  1  0 

通過配置我的意思可能是「否」的數據幀通道。

現在我需要在我需要找到的所有通道的東西的總和一樣

df.groupBy("Journey").agg(sum("channelA"), sum("channelB"), sum("channelC")) 

轉換其輸出是:

Journey sum(channelA) sum(channelB) sum(channelC) 
j1  2    1    0 
j2  0    1    1 

現在我想重新命名列名到原來的名字,我可以這樣做

.withColumnRenamed("sum(channelA)", channelA) 

但正如我所提到的渠道列表是可配置的,我想一個通用列命名語句來命名我所有的都概括列原來的列名,以獲得預期的數據幀爲:

Journey channelA channelB channelC 
j1  2  1    0 
j2  0  1    1 

任何建議如何處理這個

回答

15

要dinamically重命名您的DataFrame的列可以使用方法toDF(scala.collection.Seq colNames),您可以使用原始列名稱以不同的方式填充colNames

所以,你可以dinamically填充序列如下:

val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC") 

,然後調用方法toDF:

df = df.toDF(columnsRenamed: _*) 

: _*操作的原因是爲了Seq[String]投形式String*

0

它也可以通過以下方式重命名: 假設輸入df的格式爲inputDf:DataFrame,其中的列爲_1,_2。

val newDf = inputDf.selectExpr("_1 as x1", "_2 as X2") 
* as -> maps to alias 

其他詳細的解答可以在這裏找到: Renaming Column names of a Data frame in spark scala