2017-10-10 70 views
0

我和星火1.6如何平铺一个pyspark数据框? (火花1.6)

在这里工作是我的数据:

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

我想 '扁平化' 这个表。 也就是说:

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

注意,因为我与星火1.6工作,我不能使用pyspar.sql.functions.create_mappyspark.sql.functions.posexplode

回答

2

使用rdd.flatMap压扁它:

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| 
+-----+---+---+ 
相关问题