2017-10-10 4 views
0

Je travaille avec Spark 1.6Comment aplatir un dataframe pyspark? (ÉCLAIR 1.6)

Voici mes données:

eDF = sqlsc.createDataFrame([Row(v=1, eng_1=10,eng_2=20), 
         Row(v=2, eng_1=15,eng_2=30), 
         Row(v=3, eng_1=8,eng_2=12)]) 
eDF.select('v','eng_1','eng_2').show() 

+---+-----+-----+ 
| v|eng_1|eng_2| 
+---+-----+-----+ 
| 1| 10| 20| 
| 2| 15| 30| 
| 3| 8| 12| 
+---+-----+-----+ 

Je voudrais 'aplatir' cette table. C'est-à-dire:

+---+-----+---+ 
| v| key|val| 
+---+-----+---+ 
| 1|eng_1| 10| 
| 1|eng_2| 20| 
| 2|eng_1| 15| 
| 2|eng_2| 30| 
| 3|eng_1| 8| 
| 3|eng_2| 12| 
+---+-----+---+ 

Notez que depuis que je travaille avec Spark 1.6, je ne peux pas utiliser pyspar.sql.functions.create_map ou pyspark.sql.functions.posexplode.

Répondre

2

Utilisez rdd.flatMap pour l'aplatir:

df = spark.createDataFrame(
    eDF.rdd.flatMap(
     lambda r: [Row(v=r.v, key=col, val=r[col]) for col in ['eng_1', 'eng_2']] 
    ) 
) 
df.show() 
+-----+---+---+ 
| key| v|val| 
+-----+---+---+ 
|eng_1| 1| 10| 
|eng_2| 1| 20|  
|eng_1| 2| 15| 
|eng_2| 2| 30| 
|eng_1| 3| 8| 
|eng_2| 3| 12| 
+-----+---+---+