如何在 spark SQL 中重命名列名
How to rename column names in spark 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
可配置是指数据帧中可能有 '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
关于如何解决这个问题的任何建议
要动态重命名 DataFrame 的列,您可以使用方法 toDF(scala.collection.Seq colNames),您可以动态填充 colNames 与原始列名称。
所以你可以像这样动态地填充一个序列:
val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC")
然后调用方法到DF:
df = df.toDF(columnsRenamed: _*)
: _*
运算符的原因是将形式 Seq[String]
转换为 String*
。
也可以通过以下方式重命名,
假设输入 df 的形式为 inputDf: DataFrame with columns _1, _2.
val newDf = inputDf.selectExpr("_1 as x1", "_2 as X2")
* as -> maps to alias
其他详细答案可以在这里找到:
我有一个带有可配置列名的数据框,例如
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
关于如何解决这个问题的任何建议
要动态重命名 DataFrame 的列,您可以使用方法 toDF(scala.collection.Seq colNames),您可以动态填充 colNames 与原始列名称。
所以你可以像这样动态地填充一个序列:
val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC")
然后调用方法到DF:
df = df.toDF(columnsRenamed: _*)
: _*
运算符的原因是将形式 Seq[String]
转换为 String*
。
也可以通过以下方式重命名, 假设输入 df 的形式为 inputDf: DataFrame with columns _1, _2.
val newDf = inputDf.selectExpr("_1 as x1", "_2 as X2")
* as -> maps to alias
其他详细答案可以在这里找到: