如何使用 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() 的正确实现方式
答案是你不能(或者至少不能在不滥用语言活力的情况下以直接和 Pythonic 的方式)。由于值类型和 return 类型不同(元组列表与单个元组),reduce
在这里不是有效函数。例如,您可以使用 combineByKey
或 aggregateByKey
:
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
的低效版本。另见
我的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() 的正确实现方式
答案是你不能(或者至少不能在不滥用语言活力的情况下以直接和 Pythonic 的方式)。由于值类型和 return 类型不同(元组列表与单个元组),reduce
在这里不是有效函数。例如,您可以使用 combineByKey
或 aggregateByKey
:
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
的低效版本。另见