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
相关产品推荐
相关产品推荐

