Spark生成发生矩阵

ran*_*ddy 4 apache-spark apache-spark-sql pyspark-sql

我有如图所示的输入交易

apples,mangos,eggs
milk,oranges,eggs
milk, cereals
mango,apples
Run Code Online (Sandbox Code Playgroud)

我必须像这样生成一个共现矩阵的 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
Run Code Online (Sandbox Code Playgroud)

苹果和芒果一起买两次,所以矩阵[apple][mango] =2。

我被困在实现这一点的想法中?任何建议都会有很大帮助。我正在使用 PySpark 来实现这一点。

hi-*_*zir 5

如果数据如下所示:

df = spark.createDataFrame(
    ["apples,mangos,eggs", "milk,oranges,eggs", "milk,cereals", "mangos,apples"],
    "string"
).toDF("basket")
Run Code Online (Sandbox Code Playgroud)

进口

from pyspark.sql.functions import split, explode, monotonically_increasing_id
Run Code Online (Sandbox Code Playgroud)

分裂和爆炸:

long = (df
    .withColumn("id", monotonically_increasing_id())
    .select("id", explode(split("basket", ","))))
Run Code Online (Sandbox Code Playgroud)

自连接和 corsstab

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|
# +--------+------+-------+----+------+----+-------+
Run Code Online (Sandbox Code Playgroud)