在PySpark中调用函数时出错

时间:2018-01-11 03:00:52

标签: python apache-spark functional-programming pyspark

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

STATUS

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

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

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

wordsCount = wordsSplit.reduceByKey(lambda a,b: (a+b))

错误:

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

任何人都可以帮助我吗?

P.S。:我可以通过使用简单的lambda表达式来执行相同的任务!

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

2 个答案:

答案 0 :(得分:2)

  

PS:我能够使用简单的lambda表达式执行相同的任务!

这是一种完全有效的方式来做你想要的。

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

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

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

rdd.map(swap).collect()

要更直观地看待它,请采用Scala方法

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

成为

rdd.map(swap)

将map参数(单个RDD记录)隐式传递给函数,该函数只接受一个参数

答案 1 :(得分:1)

swap函数中,您没有调用swapped lambda函数来返回交换的元组,但返回了lambda函数。

一个简单的解决方法是:

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