web-dev-qa-db-fra.com

Comment renommer les noms de colonnes dans spark SQL

J'ai un dataframe avec des noms de colonnes configurables, par exemple

Journey channelA channelB channelC
j1      1        0        0
j1      0        1        0
j1      1        0        0
j2      0        0        1 
j2      0        1        0

Par configurable, je veux dire qu'il pourrait y avoir «n» canaux dans la trame de données.

Maintenant, j'ai besoin d'une transformation dans laquelle j'ai besoin de trouver la somme de tous les canaux, quelque chose comme 

df.groupBy("Journey").agg(sum("channelA"), sum("channelB"), sum("channelC"))

La sortie de ce qui serait:

Journey sum(channelA) sum(channelB) sum(channelC)
j1      2             1             0
j2      0             1             1

Maintenant, je veux renommer les noms de colonne aux noms originaux et je pourrais le faire avec

.withColumnRenamed("sum(channelA)", channelA)

mais comme je l’ai mentionné, la liste des canaux est configurable et je souhaiterais qu’une instruction générique de changement de nom de colonne renomme toutes les colonnes additionnées en noms de colonnes d’origine pour obtenir le cadre de données attendu de la manière suivante:

Journey channelA channelB channelC
j1      2        1             0
j2      0        1             1

Des suggestions comment aborder cette

6
hbabbar

Pour renommer dinamiquement vos colonnes DataFrame, vous pouvez utiliser la méthode toDF (scala.collection.Seq colNames) , avec laquelle vous pouvez renseigner dinamiquement colNames avec les noms de colonne d'origine.

Vous pouvez donc peupler dinamiquement une séquence comme celle-ci:

val columnsRenamed = Seq("Journey", "channelA", "channelB","channelC") 

puis appelez la méthode toDF:

df = df.toDF(columnsRenamed: _*)

La raison de l'opérateur : _* consiste à convertir le formulaire Seq[String] en String*.

16
Umberto Griffo

Il peut également être renommé de la manière suivante: Supposons que l'entrée df soit de la forme inputDf: DataFrame avec les colonnes _1, _2.

val newDf = inputDf.selectExpr("_1 as x1", "_2 as X2")
* as -> maps to alias

D'autres réponses détaillées peuvent être trouvées ici:Renommer les noms de colonnes d'un cadre de données dans spark scala

1
Pramit