2017-10-15 1 views
0

J'ai dataframe comme ci-dessous.Transpose Dataframe dans Scala

+---+------+------+ 
| ID|Field1|Field2| 
+---+------+------+ 
| 1|  x|  n| 
| 2|  a|  b| 
+---+------+------+ 

Et je besoin de la sortie comme ci-dessous

+---+-------------+------+ 
| ID|  Fields|values| 
+---+-------------+------+ 
| 1|Field1,Field2| x,n| 
| 2|Field1,Field2| a,b| 
+---+-------------+------+ 

Je suis assez nouveau pour scala .. J'ai juste besoin d'une approche pour le faire. J'ai déjà fait des recherches sur internet concernant la transposition, mais je n'ai pas pu trouver la solution.

Répondre

1

Puisque la colonne Fields va être la même dans chaque ligne, vous pouvez l'ajouter plus tard.

Dans cet exemple, la classe Thing a 3 champs: id, Field1, Field2.

val sqlContext = new org.apache.spark.sql.SQLContext(sc) 
import sqlContext.implicits._ 
import org.apache.spark.sql.functions._ 

val df = 
    sc 
    .parallelize(List(Thing(1, "a", "b"), Thing(2, "x", "y"))) 
    .toDF("id", "Field1", "Field2") 

Les noms de colonnes sont retournées dans le même ordre que nous puissions simplement prendre deux derniers pour les noms de champ

val fieldNames = 
    df 
    .columns 
    .takeRight(2) 

Le org.apache.spark.sql.functions fait tout le travail combinant les données des colonnes données.

val res = 
    df 
    .select($"id", array($"Field1", $"Field2") as "values") 
    .withColumn("Fields", lit(fieldNames)) 

res.show() 

Résultat:

+---+------+----------------+ 
| id|values|   Fields| 
+---+------+----------------+ 
| 1|[a, b]|[Field1, Field2]| 
| 2|[x, y]|[Field1, Field2]| 
+---+------+----------------+