我在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
答案 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)
# ^^^