Spark生成出现矩阵

5
我已输入如下所示的交易记录。
apples,mangos,eggs
milk,oranges,eggs
milk, cereals
mango,apples

我需要生成一个类似于这样的Spark数据框架,其中包含共现矩阵。
     apple mango  milk cereals  eggs
apple    2     2      0     0       1
mango    2     2      0     0       1
milk     0     0      2     1       1
cereals  0     0      1     1       0
eggs     1     1      1     0       2

苹果和芒果一起购买了两次,因此在一个矩阵[apple][mango] = 2中。

我在实现这个想法时遇到了困难?有什么建议吗?我正在使用PySpark来实现这个问题。


你的原始数据模式是什么? - mtoto
1个回答

9
如果数据呈现以下形式:
df = spark.createDataFrame(
    ["apples,mangos,eggs", "milk,oranges,eggs", "milk,cereals", "mangos,apples"],
    "string"
).toDF("basket")

导入

from pyspark.sql.functions import split, explode, monotonically_increasing_id

分割和拆分:

long = (df
    .withColumn("id", monotonically_increasing_id())
    .select("id", explode(split("basket", ","))))

自连接和交叉表

long.withColumnRenamed("col", "col_").join(long, ["id"]).stat.crosstab("col_", "col").show()

# +--------+------+-------+----+------+----+-------+
# |col__col|apples|cereals|eggs|mangos|milk|oranges|
# +--------+------+-------+----+------+----+-------+
# | cereals|     0|      1|   0|     0|   1|      0|
# |    eggs|     1|      0|   2|     1|   1|      1|
# |    milk|     0|      1|   1|     0|   2|      1|
# |  mangos|     2|      0|   1|     2|   0|      0|
# |  apples|     2|      0|   1|     2|   0|      0|
# | oranges|     0|      0|   1|     0|   1|      1|
# +--------+------+-------+----+------+----+-------+

完美的解决方案。谢谢。 - ranjith reddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接