Spark генерирует матрицу появления
У меня есть входные транзакции, как показано
apples,mangos,eggs
milk,oranges,eggs
milk, cereals
mango,apples
Я должен сгенерировать искровый фрейм данных матрицы совместного появления, как это.
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.
Я застрял в идеях для реализации этого? Любые предложения будут отличной помощью. Я использую py spark для реализации этого.
1 ответ
Решение
Если данные выглядят так:
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|
# +--------+------+-------+----+------+----+-------+