将RDD转换为列联表:Pyspark

时间:2016-05-29 19:58:32

标签: python apache-spark pyspark pyspark-sql

目前我正在尝试将RDD转换为contingency table以使用pyspark.ml.clustering.KMeans模块,该模块将数据帧作为输入。

当我myrdd.take(K)时,(其中K是某个数字),结构如下:

  

[[u' user1',(' itm1',3),...,(' itm2',1)],[u'用户2'(' ITM1',7),...,   (' ITM2',4)],...,[U'用户N'(' ITM2',2),...,(' itm3',10)]]

每个列表包含一个实体作为第一个元素,以及该实体以元组形式所喜欢的所有项目及其计数的集合。

现在,我的目标是将上述内容转换为类似于以下列联表的spark 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)如何将此值 3 合并(或添加)到列联表的最终结果中(或实体项目矩阵)。

当然,我通过将上面的RDD列表转换为矩阵并将它们写为csv文件然后以DataFrame的形式回读来采取漫长的路径。

使用DataFrame有更简单的方法吗?

1 个答案:

答案 0 :(得分:0)

使用createDataFrame()方法将RDD转换为pyspark数据帧。

使用交叉表方法后使用show方法。请参考以下示例:

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

以表格格式显示:

cf.show()

输出:

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