给定以下列表:
[(0, [135, 2]), (0, [2409, 1]), (0, [12846, 2]), (1, [13840, 2]), ...]
如果列表值的第二个元素(即0
的2, 1, 2
和1
的2
)大于或等于某个值(假设为2),则需要为每个键输出列表值的第一个元素列表(即,0
的135, 2409, 12846
和1
的13840
)。例如,在这种特殊情况下,输出应该是:
[(0, [135, 12846]), (1, [13840]), ...]
元组(0, [2409, 1])
被丢弃,因为1 < 2
.
我已经通过应用groupByKey()
, mapValues(list)
和最终的map
函数实现了这一点,但显然groupByKey()
比reduce函数效率低。
是否可以通过使用reduceByKey()
或combineByKey()
函数来实现该任务?
答案是肯定的:)您可以使用reduceByKey
实现与groupByKey
相同的功能。事实上,reduceByKey
应该总是受到青睐,因为它在洗牌数据之前执行映射侧减少。
使用reduceByKey
的解决方案(在Scala中,但我相信你能理解,如果你愿意,可以很容易地将其转换为Python):
val rdd = sc.parallelize(List((0, List(135, 2)), (0, List(2409, 1)), (0, List(12846, 2)), (1, List(13840, 2))))
rdd.mapValues(v => if(v(1) >= 2) List(v(0)) else List.empty)
.reduceByKey(_++_)