2016-05-29 147 views
2

目前我正在嘗試將RDD轉換爲contingency table,以便使用將數據幀作爲輸入的pyspark.ml.clustering.KMeans模塊。將RDD轉換爲應急表:Pyspark

當我做myrdd.take(K),(其中,K是一定數目的)結構如下所示:

[[u'user1' ,( 'ITM1',3),...,('ITM2 '',1)],[u'user2',('itm1',7),..., ('itm2',4)],...,[u'usern',('itm2',2 ),...,(「itm3」,10)]]

其中每個列表包含一個實體作爲第一個元素和集合中的所有項目和他們的罪名,是由這個實體的形式很喜歡元組。

現在,我的目標是將上述內容轉換爲類似下列應急表的火花DataFrame

+----------+------+----+-----+ 
|entity |itm1 |itm2|itm3 | 
+----------+------+----+-----+ 
| user1 |  3| 1| 0| 
| user2 |  7| 4| 0| 
| usern |  0| 2| 10| 
+----------+------+----+-----+ 

我已經使用了df.stat.crosstab方法,在下面的鏈接引用:

Statistical and Mathematical Functions with DataFrames in Apache Spark - 4. Cross Tabulation (Contingency Table)

而且幾乎接近我想要的東西。

但是,如果有一個以上計數字段像在上述元組即('itm1',3)如何將(或添加)這個值入列聯表(或實體項矩陣)的最終結果。

當然,我走的路線很長,將上面的RDD列表轉換爲矩陣,並將它們寫爲csv文件,然後回讀爲DataFrame

有沒有更簡單的方法來使用DataFrame?

+1

[樞軸火花數據幀(的可能的複製http://stackoverflow.com

cf = train_predictions.crosstab("prediction","label_col") 

要以表格形式顯示它/ questions/30244910/pivot-spark-dataframe) – zero323

+0

對於這個問題,我不同意@ zero323是一個「直接」重複,但[鏈接提供](http://stackoverflow.com/a/35676755/3415409)提供了一種替代方式o做你正在尋找的東西。 – eliasah

+0

這個問題的答案可以從我最近的一個問題[轉換RDD到Dataframe]中看到(http://stackoverflow.com/questions/37552052/convert-a-rdd-of-tuples-of-varying-尺寸到一個非數據幀-在火花)。儘管這最初是爲了將RDD結構轉換爲數據框,但使用pivoting,groupby和sum的答案的最後部分爲此問題提供瞭解決方案。如果任何人覺得它是重複的,我會結束當前的問題。 – Rkz

回答

0

使用createDataFrame()方法將RDD轉換爲pyspark數據框。

使用交叉表法後使用show方法。請參考下面的例子:

cf.show() 

輸出::

+--------------------+----+----+ 
|prediction_label_col| 0.0| 1.0| 
+--------------------+----+----+ 
|     1.0| 752|1723| 
|     0.0|1830| 759| 
+--------------------+----+----+