You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PySpark中统计物品共同出现的次数?

解决PySpark统计物品共同出现总次数的问题

处理步骤

针对你的需求,可通过以下高效步骤实现:

  1. 解析字符串物品列:把items列中[a,b,c]格式的字符串转换为物品数组
  2. 生成两两物品组合:对每个物品数组生成所有不重复的2元素组合
  3. 标准化物品对:统一物品对的顺序(比如(a,b)和(b,a)视为同一统计组)
  4. 聚合频次总和:按标准化后的物品对分组,累加对应频次

完整PySpark代码

from pyspark.sql import SparkSession
from pyspark.sql.functions import regexp_replace, split, explode, combinations, array_sort, concat_ws, sum as spark_sum

# 初始化SparkSession
spark = SparkSession.builder.appName("ItemCooccurrence").getOrCreate()

# 模拟示例数据(替换为你的实际DataFrame)
data = [
    ("[a,b,c]", 10),
    ("[c,d,e]", 16),
    ("[a,e]", 7),
    ("[a,b,e]", 2),
    ("[b,c]", 6),
    ("[c,d,e,b]", 5)
]
df = spark.createDataFrame(data, schema=["items", "freq"])

# 1. 解析字符串为物品数组
df = df.withColumn(
    "item_array",
    split(regexp_replace("items", r"^\[|\]$", ""), ",")
)

# 2. 生成2元素组合,3. 标准化物品对(排序后拼接为统一键)
df = df.withColumn(
    "item_pair",
    explode(combinations("item_array", 2))
).withColumn(
    "standard_pair",
    concat_ws(",", array_sort("item_pair"))
)

# 4. 聚合计算总频次
result_df = df.groupBy("standard_pair").agg(spark_sum("freq").alias("total_freq"))

# 转换为你需要的元组列表格式
result = [(tuple(row.standard_pair.split(",")), row.total_freq) for row in result_df.collect()]
print(result)

结果验证

运行代码后会得到符合预期的结果:

  • (a, b)总频次:10(第一行)+2(第四行)=12
  • (c, d)总频次:16(第二行)+5(第六行)=21
  • 其余物品组合的频次也会正确累加

适配说明

  • 若你的Spark版本低于3.0,combinations函数不可用,可通过自定义UDF生成两两组合
  • 数万行数据的场景下,该方案基于Spark分布式计算,性能可得到保障

内容的提问来源于stack exchange,提问作者Fisseha Berhane

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 21:55:24