如何在RDD中按Key获取每个键对应值的最大值?
解决按RDD Key获取对应最大值记录的问题
嘿,我完全懂你的困扰——你要的是针对每个USERID(也就是RDD的键),找出该键下对应值中第二个元素(x[1][1])最大的那条完整记录,而不是整个RDD的全局最大值。直接调用RDD的max()方法确实会返回全局结果,咱们换两种高效的方式来实现:
方法1:用reduceByKey()(推荐,性能更优)
reduceByKey()会自动按键分组,然后对每组内的元素进行两两比较,保留符合条件的记录,是处理这类分组聚合的高效方式:
# 假设你的原始RDD名为user_count_genres result_rdd = user_count_genres.reduceByKey(lambda a, b: a if a[1][1] > b[1][1] else b) # 查看结果 result_rdd.collect()
这段代码的逻辑是:对同一个USERID下的每一对记录a和b,比较它们的x[1][1]值,留下数值更大的那条记录。最终每个USERID只会保留对应最大值的那条数据,输出就是你想要的:
[(101372, ('Drama', 250)), (10123, ('Western', 250))]
方法2:用groupByKey() + map()(逻辑更直观)
如果想先明确分组再处理,可以先用groupByKey()按USERID分组,再对每组的元素集合取最大值:
result_rdd = user_count_genres.groupByKey().map( lambda x: (x[0], max(x[1], key=lambda item: item[1])) ) # 查看结果 result_rdd.collect()
这里的max(x[1], key=lambda item: item[1])会在当前USERID的所有值中,以item[1](也就是你要比较的数值)为依据,找出最大的那条完整记录。
为什么你之前的代码不行?
你用的userCountGenres.max(lambda x : x[1][1])是RDD的全局聚合操作,它会遍历整个RDD的所有元素,找出x[1][1]最大的那一条,而不会按键分组处理,所以才会得到全局最大值,而不是每个USERID对应的最大值。
内容的提问来源于stack exchange,提问作者michael green
相关产品推荐
相关产品推荐

