ran*_*ddy 4 apache-spark apache-spark-sql pyspark-sql
我有如图所示的输入交易
apples,mangos,eggs
milk,oranges,eggs
milk, cereals
mango,apples
Run Code Online (Sandbox Code Playgroud)
我必须像这样生成一个共现矩阵的 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
Run Code Online (Sandbox Code Playgroud)
苹果和芒果一起买两次,所以矩阵[apple][mango] =2。
我被困在实现这一点的想法中?任何建议都会有很大帮助。我正在使用 PySpark 来实现这一点。
如果数据如下所示:
df = spark.createDataFrame(
["apples,mangos,eggs", "milk,oranges,eggs", "milk,cereals", "mangos,apples"],
"string"
).toDF("basket")
Run Code Online (Sandbox Code Playgroud)
进口
from pyspark.sql.functions import split, explode, monotonically_increasing_id
Run Code Online (Sandbox Code Playgroud)
分裂和爆炸:
long = (df
.withColumn("id", monotonically_increasing_id())
.select("id", explode(split("basket", ","))))
Run Code Online (Sandbox Code Playgroud)
自连接和 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|
# +--------+------+-------+----+------+----+-------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
982 次 |
| 最近记录: |