Pyspark 确定每个产品对的联合会话数
我有这个数据框:Pyspark 确定每个产品对的联合会话数,pyspark,Pyspark,我有这个数据框: from pyspark.mllib.linalg.distributed import IndexedRow rows = sc.parallelize([[1, "A"], [1, 'B'] , [1, "A"], [2, 'A'], [2, 'C'] ,[3,'A'], [3, 'B']]) rows_df = rows.toDF(["session_id", "product"]) rows_df.show() +----------+-------+ |ses
from pyspark.mllib.linalg.distributed import IndexedRow
rows = sc.parallelize([[1, "A"], [1, 'B'] , [1, "A"], [2, 'A'], [2, 'C'] ,[3,'A'], [3, 'B']])
rows_df = rows.toDF(["session_id", "product"])
rows_df.show()
+----------+-------+
|session_id|product|
+----------+-------+
| 1| A|
| 1| B|
| 1| A|
| 2| A|
| 2| C|
| 3| A|
| 3| B|
+----------+-------+
我想知道每个产品对在一起有多少个联合会议。相同的产品可以在一个会话中多次出现,但我只希望每个产品对在每个会话中出现一次计数
样本输出:
+---------+---------+-----------------+
|product_a|product_b|num_join_sessions|
+---------+---------+-----------------+
| A| B| 2|
| A| C| 1|
| B| A| 2|
| B| C| 0|
| C| A| 1|
| C| B| 0|
+---------+---------+-----------------+
我不知道如何在pyspark中实现这一点 我认为这应该做到:
import pyspark.sql.functions as F
joint_sessions = rows_df.withColumnRenamed(
'product', 'product_a'
).join(
rows_df.withColumnRenamed('product', 'product_b'),
on='session_id',
how='inner'
).filter(
F.col('product_a') != F.col('product_b')
).groupBy(
'product_a',
'product_b'
).agg(
F.countDistinct('session_id').alias('num_join_sessions')
).select(
'product_a',
'product_b',
'num_join_sessions'
)
joint_sessions.show()
获取具有关节会话的配对的关节会话计数相当容易。您可以通过在
session\u id
上将数据帧连接到自身并过滤掉产品相同的行来实现这一点
然后按产品
对分组,并计算不同的会话id
s
导入pyspark.sql.f函数
行别名(“l”).join(行别名(“r”),on=“session\u id”,how=“inner”)\
.其中(“l.产品!=r.产品”)\
.groupBy(f.col(“l.product”)。别名(“product_a”);f.col(“r.product”)。别名(“product_b”))\
.agg(f.countDistinct(“会话id”).alias(“num\u加入会话”))\
.show()
#+---------+---------+-----------------+
#|产品a |产品b |数量加入||
#+---------+---------+-----------------+
#|A | C | 1|
#|C | A | 1|
#|B | A | 2|
#|A | B | 2|
#+---------+---------+-----------------+
(旁注:如果只需要唯一的产品对,请将!=
更改为,这不包括B
,C
pair@pault怎么不呢?或者你的意思是它不显示num\u join\u sessions=0
案例?是的,它不包括0
案例。