Comment changer la position d'une colonne dans une base de données spark?

je me demandais s'il était possible de changer la position d'une colonne dans une base de données, en fait de changer le schéma ?

Justement si j'ai un dataframe comme [champ1, champ2, champ3], et je voudrais obtenir [champ1, champ3, champ2].

Toute aide serait grandement appréciée !

Merci.

Edit : je ne peux pas mettre n'importe quel morceau de code. Imaginons que nous travaillons avec une base de données avec cent colonnes, après quelques jointures et trnsformations, certaines de ces colonnes sont mal placées en ce qui concerne le schéma de la table de destination. Donc mon point est : comment déplacer une ou plusieurs colonnes, I. e: comment changer le schéma ?

Merci.

16
demandé sur obiwan kenobi 2016-06-29 18:55:22

4 réponses

Vous pouvez obtenir les noms des colonnes, les réorganiser comme vous le voulez, et ensuite utiliser select sur l'original DataFrame pour obtenir une nouvelle avec ce nouvel ordre:

val columns: Array[String] = dataFrame.columns
val reorderedColumnNames: Array[String] = ??? // do the reordering you want
val result: DataFrame = dataFrame.select(reorderedColumnNames.head, reorderedColumnNames.tail: _*)
35
répondu Tzach Zohar 2016-06-29 17:06:37

comme d'autres ont commenté, Je suis curieux de savoir pourquoi vous feriez cela car l'ordre n'est pas pertinent quand vous pouvez interroger les colonnes par leurs noms.

quoi qu'il en soit, l'utilisation d'un select devrait donner l'impression que les colonnes ont bougé dans la description du schéma:

val data = Seq(
  ("a",       "hello", 1),
  ("b",       "spark", 2)
)
.toDF("field1", "field2", "field3")

data
 .show()

data
 .select("field3", "field2", "field1")
 .show()
3
répondu Raphaël Brugier 2018-03-21 01:13:49

une toute petite version différente comparer à @Tzach Zohar

val cols = df.columns.map(df(_)).reverse
val reversedColDF = df.select(cols:_*)
2
répondu Rockie Yang 2016-06-29 18:21:31

spark-daria la bibliothèque dispose d'un reorderColumns méthode qui permet de réordonner facilement les colonnes dans une base de données.

import com.github.mrpowers.spark.daria.sql.DataFrameExt._

val actualDF = sourceDF.reorderColumns(
  Seq("field1", "field3", "field2")
)

si vous voulez obtenir l'ordre des colonnes de df1 pour égaler l'ordre des colonnes de df2, quelque chose comme cela devrait fonctionner mieux que de coder en dur toutes les colonnes:

df1.reorderColumns(df2.columns)

spark-daria bibliothèque définit également un sortColumns transformation pour trier les colonnes en ordre ascendant ou descendant (si vous ne voulez pas spécifier toutes les colonnes dans une séquence).

import com.github.mrpowers.spark.daria.sql.transformations._

df.transform(sortColumns("asc"))
1
répondu Powers 2017-12-02 19:11:29