Spark生成出现矩阵

时间:2018-01-31 21:40:24

标签: apache-spark apache-spark-sql pyspark-sql

我输入的交易如图所示

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来实现这一点。

1 个答案:

答案 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|
# +--------+------+-------+----+------+----+-------+