【发布时间】:2016-03-10 11:21:19
【问题描述】:
我想在 Scala/Spark 中实现一个函数,它可以采用多个减速器/聚合器并一次执行它们。所以基本上我给出了 reduce 函数和初始值,它应该在一次传递中创建一个复合 reduce 操作。
以下是 Python 中的逻辑
from functools import reduce
def reduce_at_once(data, reducer_funcs_inits):
reducer_funcs, inits = zip(*reducer_funcs_inits)
complete_reducer_func = lambda acc, y: tuple(rf(a_x, y) for a_x, rf in zip(acc, reducer_funcs))
return list(reduce(complete_reducer_func, data, inits))
data = list(range(1, 20))
reducer_funcs_inits = [(lambda acc, y: acc + y, 0), # sum
(lambda acc, y: acc * y, 1) # product
]
print(list(reduce_at_once(data, reducer_funcs_inits)))
# [190, 121645100408832000]
我怎样才能在 Scala (Spark) 中做这样的事情?问题似乎是我有一个列表,它的长度我只在调用时才知道,而且列表的元素可能有不同的类型(减少初始累加器),具体取决于我想要包含的减速器(不一定只有这里的数字)。
【问题讨论】:
-
您还应该添加
python标签
标签: scala apache-spark reduce