J'ai le jeu de données suivant p>
Et je veux convertir ceci en ci-après avec Spark. Tous les pointeurs seraient utiles. P>
3 Réponses :
J'ai fait une méthode il y a quelque temps pour le faire: Vous pouvez l'utiliser comme ceci: p> donne p>
Spark 2.4.3 Vous pouvez mapper mapper_from_array et c'est une fonction assez droite et une fonction intégrée. p>
xxx pré> Appliquer map_from_array et explosera que cela donnera le résultat souhaité p> blockQuote>
xxx pré> Je pense que la fonction intégrée donnera plus de performances par rapport à UDF. P> blockQquote>
Vous pouvez également faire en utilisant la fonction de pile aussi.
Voici un exemple de code pour l'essayer. p>
val df = Seq((1,40,60,10), (2,34,10,20), (3,87,29,62) ).toDF("cust_id","100x","200x","300x") df.show() scala> df.show() +-------+----+----+----+ |cust_id|100x|200x|300x| +-------+----+----+----+ | 1| 40| 60| 10| | 2| 34| 10| 20| | 3| 87| 29| 62| +-------+----+----+----+ val skipColumn = "cust_id" var columnCount = df.schema.size -1 df.columns var columnsStr = "" var counter = 0 for ( col <- df.columns ) { counter = counter + 1 if(col != skipColumn) { if(counter == df.schema.size) { columnsStr = columnsStr + s"'$col', $col" } else { columnsStr = columnsStr + s"'$col', $col," } } } val unPivotDF = df.select($"cust_id", expr(s"stack($columnCount, $columnsStr) as (Sid,Value)")) unPivotDF.show() scala> unPivotDF.show() +-------+----+-----+ |cust_id| Sid|Value| +-------+----+-----+ | 1|100x| 40| | 1|200x| 60| | 1|300x| 10| | 2|100x| 34| | 2|200x| 10| | 2|300x| 20| | 3|100x| 87| | 3|200x| 29| | 3|300x| 62| +-------+----+-----+