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

PySpark中如何检测数组元素的成对出现趋势

计算Spark DataFrame中标签对的最高共现频率

步骤1:拆分标签并生成同一电影内的唯一标签对

先把每个电影的标签数组拆成单个标签,再对同一电影的标签做自连接,生成所有可能的组合。通过过滤标签相同的情况,以及强制标签对的顺序(比如让tag1字典序小于tag2),避免重复统计反向的同一标签对(比如(comedy, horror)和(horror, comedy)只算一次)。

// Scala 实现
import org.apache.spark.sql.functions._

val tagPairsDF = df
  .select(explode(col("tags")).alias("tag1"), col("tags"))
  .withColumn("tag2", explode(col("tags")))
  .filter(col("tag1") < col("tag2"))
  .drop("tags")
# PySpark 实现
from pyspark.sql import functions as F

tag_pairs_df = df.select(F.explode(F.col("tags")).alias("tag1"), F.col("tags")) \
    .withColumn("tag2", F.explode(F.col("tags"))) \
    .filter(F.col("tag1") < F.col("tag2")) \
    .drop("tags")

步骤2:统计标签对的共现频率并排序

对生成的标签对分组计数,再按频率降序排列,就能得到共现次数最多的标签对。

// Scala 实现
tagPairsDF
  .groupBy("tag1", "tag2")
  .count()
  .orderBy(desc("count"))
  .show()
# PySpark 实现
tag_pairs_df.groupBy("tag1", "tag2") \
    .count() \
    .orderBy(F.desc("count")) \
    .show()

补充说明

因为题目里只有10种唯一标签,总共有45种可能的标签对,这种方法的计算量非常小,完全不需要考虑性能问题。如果标签数量更大,也可以在map阶段直接生成标签组合,减少shuffle开销,但对于当前场景,上面的实现已经足够简单高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:12:11