如何使用reduceByKey而不是GroupByKey来构建列表?

时间:2015-12-15 15:37:21

标签: python apache-spark pyspark rdd

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

=INDEX(A:A,MATCH(TRUE,INDEX(ISNUMBER(A:A),0),0))

我在RDD上使用GroupByKey,结果为

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

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

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

但它不起作用。

请建议使用reduceByKey()

实施的正确方法

1 个答案:

答案 0 :(得分:2)

答案是你不能(或者至少不是在没有滥用语言活力的情况下以简单和Pythonic的方式)。由于值类型和返回类型不同(元组列表与单个元组)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的低效版本。另请参阅Is groupByKey ever preferred over reduceByKey