在Spark的RDD和DStream中,我们有'减少''用于将整个RDD转换为一个元素的函数。然而,reduce函数采用(T,T)=> Ť 但是如果我们想要减少Scala中的List,我们可以使用foldLeft或foldRight,它采用类型(B)((B,A)=> B)这非常有用,因为你开始使用其他类型的类型折叠列表。
Spark中有没有办法做类似的事情?我可以从一个不同类型的值开始,然后是RDD本身的元素
答案 0 :(得分:8)
使用aggregate代替reduce。它还允许您指定类型B的“零”值和类似您想要的函数:(B,A)=> B.请注意,您还需要合并在单独的执行程序上完成的单独聚合,因此a(B,B)=> B功能也是必需的。
或者,如果您希望此聚合作为副作用,则选项是使用累加器。特别是,accumulable type允许结果类型与累积类型的类型不同。
此外,如果您甚至需要对键值RDD执行相同操作,请使用aggregateByKey。