繁体   English   中英

如何使用reduceByKey代替GroupByKey构造列表?

[英]How can I use reduceByKey instead of GroupByKey to construct a list?

我的RDD由许多项组成,每个项都是一个元组,如下所示:

(key1, (val1_key1, val2_key1))
(key2, (val1_key2, val2_key2))
(key1, (val1_again_key1, val2_again_key1))
... and so on

我在RDD上使用了GroupByKey,结果为

(key1, [(val1_key1, val2_key1), (val1_again_key1, val2_again_key1), (), ... ()])
(key2, [(val1_key2, val2_key2), (), () ... ())])
... and so on

我需要使用reduceByKey做同样的事情。 我试着做

RDD.reduceByKey(lambda val1, val2: list(val1).append(val2))

但这不起作用。

请提出使用reduceByKey()实现的正确方法

答案是您不能(或者至少不能以一种直接的Python方式而不滥用语言动态性)。 由于值类型和返回类型不同(元组列表与单个元组列表), reduce在这里不是有效的函数。 您可以使用combineByKeyaggregateByKey的示例:

rdd = sc.parallelize([
    ("key1", ("val1_key1", "val2_key1")),
    ("key2", ("val1_key2", "val2_key2"))])

rdd.aggregateByKey([], lambda acc, x: acc + [x], lambda acc1, acc2: acc1 + acc2)

但这只是groupByKey一个效率较低的版本。 另请参见groupByKey是否比reduceByKey更受青睐

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM