用 Cython 激发火花

Arn*_*nab 5 python cython pyspark

我最近想Cython与 Spark一起使用,为此我遵循了以下参考

我写了下面提到的程序,但我得到了一个:

TypeError:
fib_mapper_cython() takes exactly 1 argument (0 given)
Run Code Online (Sandbox Code Playgroud)

spark-tools.py

def spark_cython(module, method):
    def wrapped(*args, **kwargs):
        global cython_function_
        try:
            return cython_function_(*args, **kwargs)
        except:
            import pyximport
            pyximport.install()
            cython_function_ = getattr(__import__(module), method)
        return cython_function_(*args, **kwargs)
    return wrapped()
Run Code Online (Sandbox Code Playgroud)

fib.pyx

def fib_mapper_cython(n):
    '''
     Return the first fibonnaci number > n.
    '''
    cdef int a = 0
    cdef int b = 0
    cdef int j = int(n)
    while b<j:
        a, b  = b, a+b
    return b, 1
Run Code Online (Sandbox Code Playgroud)

主文件

from spark_tools import spark_cython
import pyximport
import os
from pyspark import SparkContext
from pyspark import SparkConf
pyximport.install()


os.environ["SPARK_HOME"] = "/home/spark-1.6.0"
conf = (SparkConf().setMaster('local').setAppName('Fibo'))

sc = SparkContext()
sc.addPyFile('file:///home/Cythonize/fib.pyx')
sc.addPyFile('file:///home/Cythonize/spark_tools.py')
lines = sc.textFile('file:///home/Cythonize/nums.txt')

mapper = spark_cython('fib', 'fib_mapper_cython')
fib_frequency = lines.map(mapper).reduceByKey(lambda a, b: a+b).collect()
print fib_frequency
Run Code Online (Sandbox Code Playgroud)

TypeError每当我运行程序时,我都会得到一个。有任何想法吗?

Jim*_*ard 6

这不是Cython问题PySpark,不幸的是您在 的定义期间添加了额外的函数调用spark_cython。具体来说,包装调用的函数cython_function在返回时不带参数被调用:

return wrapped()  # call made, no args supplied.
Run Code Online (Sandbox Code Playgroud)

因此,当您执行此调用时,您将不会返回包装的函数。你所做的就是wrapped用 no*args或来调用**kwargswrapped然后fib_mapper_cython不带参数调用(因为*args, **kwargs未提供),因此TypeError.

你应该:

return wrapped
Run Code Online (Sandbox Code Playgroud)

这个问题应该不再存在。