如何在spark SQL

时间:2016-09-29 02:57:31

标签: dataframe apache-spark-sql spark-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

有关如何处理此问题的任何建议

2 个答案:

答案 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