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|
# +--------+------+-------+----+------+----+-------+
Другие вопросы по тегам