Искра с Китоном

87
11

Недавно я хотел использовать Cython с Spark, для которого я следил за следующей ссылкой.


Я написал следующие программы, как упоминалось, но я получаю:


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 всякий раз, когда запускаю программу. Любые идеи?

спросил(а) 2021-01-19T17:25:21+03:00 2 месяца, 3 недели назад
1
Решение
97

Это не проблема Cython и PySpark, вы, к сожалению, добавили дополнительный вызов функции во время определения spark_cython. В частности, функция, которая обертывает вызов cython_function, вызывается без аргументов при возврате:


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

В результате вы не вернете завернутую функцию при выполнении этого вызова. Вы делаете вызов wrapped без *args или **kwargs. wrapped затем вызывает fib_mapper_cython без аргументов (поскольку *args, **kwargs не предоставляется), следовательно, TypeError.

Вместо этого вы должны:


return wrapped

и этот вопрос больше не должен присутствовать.

ответил(а) 2021-01-19T17:25:21+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема