我有一个带有可配置列名的dataframe,例如
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
有什么建议吗?如何处理这个问题
发布于 2016-09-29 16:15:37
要以动态方式重命名DataFrame的列,可以使用toDF(scala.collection.Seq colNames)方法,使用该方法可以使用原始列名以动态方式填充colNames。
因此,您可以按如下方式按顺序填充序列:
val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC")
然后调用方法toDF:
df = df.toDF(columnsRenamed: _*)
使用: _*
运算符的原因是将Seq[String]
转换为String*
。
发布于 2016-12-28 08:24:47
也可以通过以下方式重命名它,比如输入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
https://stackoverflow.com/questions/39760675
复制相似问题