Skip to main content
 首页 » 编程设计

python之PySpark reduceByKey 只用一个键

2025年05月04日74zhujiabin

我有一个这样的rdd

// Structure List[Tuple(x1, x2, value), Tuple(x1, x2, value)] 
data = [('23', '98', 34), ('23', '89', 39), ('23', '12', 30), ('24', '12', 34), ('24', '14', 37), ('24', '16', 30)] 

我正在寻找最终结果,即 x1 的得分最大值和与之关联的 x2 值。像这样

data = [('23', '89', 39), ('24', '14', 37)] 

我试过 reduceByKey 但它给了我每个组合的最大值,这不是我想要的。

来自 comment :

这是我尝试过的:

max_by_group = ( 
    data.map(lambda x: (x[0], x)) 
        .reduceByKey(lambda x1, x2: max(x1, x2, key=lambda x: x[-1]))  
        .values() 
) 

请您参考如下方法:

groupBy 第一个元素,然后通过元组中的第三个元素找到每个组的最大值:

(rdd.groupBy(lambda x: x[0]) 
    .mapValues(lambda x: max(x, key=lambda y: y[2])) 
    .values() 
).collect() 
# [('24', '14', 37), ('23', '89', 39)] 

或者使用reduceByKey:

(rdd.map(lambda x: (x[0], x)) 
    .reduceByKey(lambda x, y: x if x[2] > y[2] else y) 
    .values() 
).collect() 
# [('24', '14', 37), ('23', '89', 39)]