3

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

当我这样做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了以下链接中引用的方法:

Apache Spark 中使用 DataFrames 的统计和数学函数 - 4. 交叉制表(列联表)

它几乎接近我想要的。

但是,如果在上面的元组中还有一个计数字段,即('itm1',3)如何将这个值3合并(或添加)到列联表(或实体项矩阵)的最终结果中。

当然,我通过将上述列表RDD转换为矩阵并将它们写入 csv 文件,然后作为DataFrame.

有没有更简单的方法来使用 DataFrame ?

4

1 回答 1

1

使用 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|
+--------------------+----+----+
于 2018-02-01T06:11:14.037 回答