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
案例。