我输入的交易如图所示
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
苹果和芒果一起买两次,所以在一个矩阵[苹果] [芒果] = 2。
我坚持实施这个想法?任何建议都会有很大的帮助。我正在使用PySpark来实现这一点。
答案 0 :(得分:4)
如果数据如下所示:
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", ","))))
自我加入和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|
# +--------+------+-------+----+------+----+-------+