我有如图所示的输入交易
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 来实现这一点。
最佳答案
如果数据如下所示:
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
split 和爆炸:
long = (df
.withColumn("id", monotonically_increasing_id())
.select("id", explode(split("basket", ","))))
自连接和 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|
# +--------+------+-------+----+------+----+-------+
关于apache-spark - Spark生成发生矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551900/