在PySp中调用函数时出错

2024-09-28 23:39:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我在PySpark中创建了一个简单的函数,它交换键、值对并返回它。在

def swap(x):
    swapped = lambda x: (x[1],x[0])
    return swapped

我有一个RDD,它给出了文件中的字数:

^{pr2}$

现在,当我调用函数来交换键、值对时,它会抛出一个错误:

wordsCountSwap = wordsCount.map(swap)
wordsCountSwap.collect()

错误:

Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last):
  File "/home/sumit/spark-2.2.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/worker.py", line 177, in main
    process()
  File "/home/sumit/spark-2.2.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/worker.py", line 172, in process
    serializer.dump_stream(func(split_index, iterator), outfile)
  File "/home/sumit/spark-2.2.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/serializers.py", line 272, in dump_stream
    bytes = self.serializer.dumps(vs)
  File "/home/sumit/spark-2.2.0-bin-hadoop2.7/python/lib/pyspark.zip/pyspark/serializers.py", line 447, in dumps
    return pickle.dumps(obj, protocol)
TypeError: expected string or Unicode object, NoneType found

有人能帮我吗?在

注:我可以使用一个简单的lambda表达式来执行相同的任务!在

swap = lambda x : (x[1],x[0])
wordsCountSwap = wordsCount.map(swap)
wordsCountSwap.collect()

Tags: lambdainpyhomebinliblinezip
2条回答

PS: I'm able to perform the same task using simple lambda expression!

这是做你想做的事的一个完全有效的方法。在

rdd.map(lambda x : (x[1], x[0])).collect()

def方法只是简单地将lambda替换为def,并添加一个返回,而不是在其间添加另一个函数。在

^{pr2}$

要更直观地查看它,请使用Scala方法

rdd.map(_ => swap(_))

变成

rdd.map(swap)

其中map参数(单个RDD记录)隐式传递给只接受一个参数的函数

swap函数中,没有调用swappedlambda函数来返回交换的元组,而是返回了lambda函数本身。在

一个简单的解决方法是:

def swap(x):
    swapped = lambda x: (x[1],x[0])
    return swapped(x)
#                 ^^^ 

相关问题 更多 >