2016-06-22 3 views
3

최근에 Cython에 Spark를 사용하고 싶습니다. 그 중 하나는 the following reference입니다. Spark with Cython

내가 언급 한 바와 같이 다음과 같은 프로그램을 썼다 그러나 나는 점점 오전 :

TypeError: 
fib_mapper_cython() takes exactly 1 argument (0 given) 

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() 

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 

main.py

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 

프로그램을 실행할 때마다 TypeError가 표시됩니다. 어떤 아이디어?

+0

fib_mapper_cython 초기 값은 무한 반복됩니다. b = 1로 변경하면 문제가 해결됩니다. – MrChristine

답변

4

이것은 Cython 또는 PySpark 문제가 아니며, 불행히도 spark_cython의 정의 중에 추가 함수 호출을 추가했습니다. 특히, cython_function에 대한 호출을 래핑 함수는 반환에 인수없이 호출 :이 호출을 실행할 때

return wrapped() # call made, no args supplied. 

은 결과적으로 당신은, 랩 된 기능을 반환하지 않습니다. 당신이하는 일은 *args 또는 **kwargs이없는 wrapped입니다. wrapped 그런 다음 fib_mapper_cython을 인수없이 호출합니다 (*args, **kwargs는 제공되지 않으므로) TypeError입니다.

return wrapped 

을이 문제는 더 이상 존재하지해야합니다

대신해야한다.

+1

도움 주셔서 감사합니다. – StarLord