2017-03-07 156 views
2

創建從外部文件數據幀DF,其具有以下模式的轉置數據幀:如何創建從另一數據幀

(ID,FIELD1,FIELD2,字段3)分配柱:ID

數據的例子是

000, 11_field1, 22_field2, 33_field3 
001, 111_field1, 222_field2, 333_field3 

我想創建DF另一個數據幀,其模式是

(id, fieleName, fieldValue) 

數據的例子是

000, field1, 11_field1 
000, field2, 22_field2 
000, field3, 33_field3 
001, field1, 111_field1 
001, field2, 222_field2 
001, field3, 333_field3 

誰能告訴我如何獲得新的數據幀?

+0

你試過我給出的答案嗎?答案是否符合您的要求? – User12345

+0

請注意回覆評論或回答 – User12345

+0

謝謝您的回答。這個對我有用。 –

回答

2

你可以像下面使用explode選項

首先導入所需的庫和功能

from pyspark.sql import SQLContext, Row 

說你的數據幀dfpyspark實現這一目標。

如果你df.show()

你應該得到類似結果如下

+---+----------+----------+----------+ 
| id| field1| field2| field3| 
+---+----------+----------+----------+ 
| 0| 11_field1| 22_field2| 33_field3| 
| 1|111_field1|222_field2|333_field3| 
+---+----------+----------+----------+ 

然後映射要爆炸的2列的所有列。在這裏,您希望除ID之外的所有列都會爆炸。所以,下面做

cols= df.columns[1:] 

當時的data frame轉換爲rdd像下面

rdd = data.rdd.map(lambda x: Row(id=x[0], val=dict(zip(cols, x[1:])))) 

要檢查如何RDD已映射不低於

rdd.take() 

你會得到結果如下圖所示

[Row(id=0, val={'field2': u'22_field2', 'field3': u'33_field3', 'field1': u'11_field1'}), Row(id=1, val={'field2': u'222_field2', 'field3': u'333_field3', 'field1': u'111_field1'})] 

然後轉換rdddata framedf2

df2 = sqlContext.createDataFrame(rdd) 

然後做df2.show()。你應該得到結果如下圖所示

+---+--------------------+ 
| id|     val| 
+---+--------------------+ 
| 0|Map(field3 -> 33_...| 
| 1|Map(field3 -> 333...| 
+---+--------------------+ 

然後註冊數據幀DF2作爲一個臨時表

df2.registerTempTable('mytempTable') 

然後運行數據幀像下面的查詢:

df3 = sqlContext.sql("""select id,explode(val) AS (fieldname,fieldvalue) from mytempTable""") 

然後做你應該得到如下結果

+---+---------+----------+ 
| id|fieldname|fieldvalue| 
+---+---------+----------+ 
| 0| field3| 33_field3| 
| 0| field2| 22_field2| 
| 0| field1| 11_field1| 
| 1| field3|333_field3| 
| 1| field2|222_field2| 
| 1| field1|111_field1| 
+---+---------+----------+