将 RDD 转换为列联表:Pyspark

Posted

技术标签:

【中文标题】将 RDD 转换为列联表:Pyspark【英文标题】:Converting RDD to Contingency Table: Pyspark 【发布时间】:2016-05-29 19:58:31 【问题描述】:

目前我正在尝试将 RDD 转换为 contingency table 以使用 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 方法:

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

它几乎接近我想要的。

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

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

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

【问题讨论】:

Pivot Spark Dataframe的可能重复 我不同意@zero323 关于这个问题的“直接”重复,但link provided 提供了另一种方法来做你正在寻找的事情。 这个问题的答案可以从我最近的一个问题Convert RDD to Dataframe 中看到。虽然这最初是为了将 RDD 结构转换为数据帧,但答案的最后一部分使用了 pivoting、groupby 和 sum 提供了这个问题的解决方案。如果有人觉得它是重复的,我将关闭当前问题。 【参考方案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|
+--------------------+----+----+

【讨论】:

以上是关于将 RDD 转换为列联表:Pyspark的主要内容,如果未能解决你的问题,请参考以下文章

SPSS—描述性统计分析—列联表

关于rc列联表的卡方检验 求助!!!

R构建列联表(Contingency Table or crosstabs)

R-无序的定类数据分析:列联表、热力图、和弦图、桑基图和统计检验

spss怎么进行列联分析

R语言构建仿真列联表并进行卡方检验(chisq.test):检验两个分类变量是否独立输出期望的列联表