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|
+-------+----+-----+