[Spark Data Frame] Changer une colonne de l'horizontale à la verticale (Scala)

introduction

Dans SparkDf, lors du passage du maintien horizontal au maintien vertical pour une colonne avec DF, cela a pris un certain temps, alors enregistrez-le sous forme de mémorandum. Pour le moment, le code source est Scala, mais il ne devrait pas beaucoup changer avec Python.

Opération de trame de données

Créer un DataFrame de test

testDf.scala


val testDf = Seq(
    (1,"a",30,20),
    (2,"a",40,30),
    (3,"c",50,40),
    (4,"d",60,50),
    (2,"d",40,70),
    (2,"d",20,10),
    (1,"a",60,90)
   )
   .toDF("Column1", "Column2", "Column3","Column4")

/*
+-------+-------+-------+-------+
|Column1|Column2|Column3|Column4|
+-------+-------+-------+-------+
|      1|      a|     30|     20|
|      2|      a|     40|     30|
|      3|      c|     50|     40|
|      4|      d|     60|     50|
|      2|      d|     40|     70|
|      2|      d|     20|     10|
|      1|      a|     60|     90|
+-------+-------+-------+-------+
*/


Tenue verticale → Tenue horizontale

La tenue verticale → la tenue horizontale est facile et vous pouvez facilement le faire avec le pivot. Lors de son utilisation, il est nécessaire d'utiliser trois méthodes telles que "df.groupby (). Pivot (). Count ()".

pivot.scala


val test2Df = testDf
.groupBy("Column1") 
.pivot("Column2") //Colonne que vous souhaitez tenir horizontalement
.count() //Fonction d'agrégation
.na.fill(0) //Remplir avec zéro

/*
+-------+---+---+---+
|Column1|  a|  c|  d|
+-------+---+---+---+
|      1|  2|  0|  0|
|      3|  0|  1|  0|
|      4|  0|  0|  1|
|      2|  1|  0|  2|
+-------+---+---+---+
*/

Tenue horizontale → Tenue verticale

Dans le sujet principal, si vous avez test2Df et que vous souhaitez le maintenir verticalement pour une raison quelconque. Tenue horizontale → La tenue verticale n'a pas de fonction qui peut être réalisée en un seul coup comme le pivot, est-ce un peu gênant? Ajouter. Ceux utilisés sont "selectExpr ()" et "stack". Le code source est le suivant.

unpivot.scala


val test3Df = test2Df
    .selectExpr(
        "Column1",//Colonne cible servant de référence pour le maintien vertical
        "stack(3,'a',a,'c',c,'d',d)".//Original à tenir verticalement
    )
/*
+-------+----+----+
|Column1|col0|col1|
+-------+----+----+
|      1|   a|   2|
|      1|   c|   0|
|      1|   d|   0|
|      3|   a|   0|
|      3|   c|   1|
|      3|   d|   0|
|      4|   a|   0|
|      4|   c|   0|
|      4|   d|   1|
|      2|   a|   1|
|      2|   c|   0|
|      2|   d|   2|
+-------+----+----+
*/

Il peut être transformé comme ça. Tout d'abord, spécifiez la colonne cible qui sera tenue verticalement, puis utilisez stack () pour spécifier la source qui sera tenue verticalement. Dans le cas ci-dessus, a, c et d sont tenus verticalement pour Colonne1. 3 in stack () fait référence au nombre d'exploitations verticales (dans ce cas, 3 de a, c, d), "a" "c" "d" fait référence au nom et acd fait référence à la valeur numérique d'origine du nom de la colonne. (Vous pouvez également saisir simplement "nom1" ou une chaîne de caractères). De plus, le nom de la colonne est col0 par défaut, donc si vous voulez le changer, vous pouvez le changer en utilisant **. WithColumnRenamed ("col0", "○○") **.

Après cela, je pense que si vous utilisez bien la jointure, vous pouvez passer d'une tenue verticale à une tenue horizontale.

Lien de référence

How to Pivot and Unpivot a Spark DataFrame

Recommended Posts

[Spark Data Frame] Changer une colonne de l'horizontale à la verticale (Scala)
Changer le bloc de données des données d'achat de pandas (produit ID X) en dictionnaire
Générer une image verticale d'un roman à partir de données textuelles
Un mémo qui lit les données de dashDB avec Python et Spark
Créer un bloc de données à partir des données textuelles de course de bateaux acquises
[Linux] Copie des données de Linux vers Windows avec un script shell
[Python] Comment obtenir et modifier les lignes / colonnes / valeurs d'une table.
De l'installation d'Elasticsearch à la saisie des données
Un mémorandum pour passer à Manjaro Linux
N'a pas changé de Python 2 à 3
Utilisez Matplotlib pour créer plusieurs graphiques linéaires à partir d'un bloc de données à la fois
Partager les événements de périphérique des conteneurs de commutateur Catalyst vers Cisco Spark