如何用reduceByKey统计RDD中列值在对应列列表中的出现次数?
解决Spark RDD中统计目标元素在列表中出现次数的问题
我来帮你分析下问题出在哪,以及怎么搞定它~
首先,你用reduceByKey的思路完全走偏了:reduceByKey的核心是对拥有相同key的多个value做聚合合并,但你的userMovies RDD里每个userID都是唯一的(至少示例数据里是这样),所以reduceByKey根本不会触发任何聚合操作,直接返回了原RDD每个元素经过lambda处理后的结果——而且你的lambda写法本身也不符合reduceByKey的要求(它需要接收两个参数来合并同key的value,你只写了一个参数)。
那正确的做法应该是这样的:
步骤1:转换每个元素为判断结果
先通过map算子,对RDD中的每个元素单独做判断:检查元组里的第一个值(也就是你说的第二列)是否存在于第三个元素的列表中,返回1(存在)或0(不存在)。
Scala代码示例:
// 处理每个元素,生成1或0的RDD val indicatorRDD = userMovies.map { case (userId, (targetMovie, movieList)) => if (movieList.contains(targetMovie)) 1 else 0 }
Python代码示例:
# 处理每个元素,生成1或0的RDD indicator_rdd = userMovies.map(lambda item: 1 if item[1][0] in item[1][1] else 0)
步骤2:对所有结果求和
接下来只需要把这个RDD里的所有数值加起来,就能得到总出现次数了:
Scala代码示例:
val totalOccurrences = indicatorRDD.sum()
Python代码示例:
total_occurrences = indicator_rdd.sum()
这样就能得到你想要的统计结果啦~
内容的提问来源于stack exchange,提问作者Jay Lincon
相关产品推荐
相关产品推荐

