我有一个带有可配置列名的数据框,例如
Journey channelA channelB channelC
j1 1 0 0
j1 0 1 0
j1 1 0 0
j2 0 0 1
j2 0 1 0
通过可配置,我的意思是数据帧中可能有'n'个通道。
现在我需要进行转换,我需要找到所有通道的总和,如
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
有关如何处理此问题的任何建议
答案 0 :(得分:16)
要重命名您的DataFrame列,您可以使用方法 toDF(scala.collection.Seq colNames),您可以使用原始列名称填充 colNames
所以你可以用这样的序列填充这个序列:
val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC")
然后调用方法toDF:
df = df.toDF(columnsRenamed: _*)
: _*
运算符的原因是将表单Seq[String]
转换为String*
。
答案 1 :(得分:1)
它也可以通过以下方式重命名, 假设输入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