pyspark减少方法的歧义

时间:2016-03-13 13:40:11

标签: python apache-spark pyspark

def reduce(self, f):                                             #1 parameter
    def func(iterator): 
        iterator = iter(iterator) 
        try: 
            initial = next(iterator) 
        except StopIteration: 
            return 
        yield reduce(f, iterator, initial)                             #3 parameter 

    vals = self.mapPartitions(func).collect() 
    if vals: 
        return reduce(f, vals)                                         #2 parameter 
    raise ValueError("Can not reduce() empty RDD") 

reduce函数只需要1个参数,但它提供2或3个参数。

我搜索整个python代码而没有任何关于reduce的定义。

2 个答案:

答案 0 :(得分:4)

reduce()有一种方法。它不在全局命名空间中;它只是类或实例的属性。当它调用reduce()时,它不是递归;它正在调用内置函数reduce()。如果要调用此处定义的reduce(),则需要使用self.reduce(...)内置函数reduce()可以带两个或三个参数。如果给定两个,它将应用第一个参数,一个函数,带有两个参数:第二个参数的前两个元素,一个序列。然后它使用它返回的内容和序列中的第三个元素调用函数,并继续这样,直到序列耗尽。当给出第三个参数时,它作为第一个参数给出,序列中的第一个元素作为第二个参数给出。下一次,它是序列的返回和第二个元素,并从那里继续。

答案 1 :(得分:1)

如zondo所述,第一个 reduce不在全局命名空间中。 它只是类或实例的属性。 内部减少类的定义称为内置python方法reduce()

在python中使用带有三个参数的内置reduce方法,如下所示:

reduce(myfunction, list, init)

您要求在列表上应用reduce myfunction init 作为初始值。