2016-09-29 116 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