繁体   English   中英

如何在pyspark的地图/ lambda中放置地图/ lambda?

[英]How to put use a map/lambda inside of a map/lambda in pyspark?

我有一个这样的清单清单:

b = [['r','w'],['n','finished']]

我希望能够对每个列表中的每个元素进行操作。

我可以在python中本地执行此操作:

result = b.map(lambda aList: \
           map(lambda aString: \
                              '' if aString.strip().lower() in [' finish', 'finished', 'terminate', 'done'] else aString,\
                              aList))

但是,Spark无法序列化内部map

 File "/<path>/python/pyspark/worker.py", line 88, in main
12/11/2015 18:24:49 [launcher]      command = pickleSer._read_with_length(infile)
12/11/2015 18:24:49 [launcher]    File "//<path>/spark/python/pyspark/serializers.py", line 156, in _read_with_length
12/11/2015 18:24:49 [launcher]      return self.loads(obj)
12/11/2015 18:24:49 [launcher]    File "//<path>//python/pyspark/serializers.py", line 405, in loads
12/11/2015 18:24:49 [launcher]      return cPickle.loads(obj)
12/11/2015 18:24:49 [launcher]  AttributeError: 'module' object has no attribute 'map'

我如何解决这个问题,使用内部地图或完成相同的事情?

一种解决方法:

to_replace = ['finish', 'finished', 'terminate', 'done'] 

rdd = sc.parallelize([['r','w'],['n','finished']])
rdd.map(lambda xs: ['' if  x.strip().lower() in to_replace else x for x in xs])

一般来说,如果您发现自己在考虑嵌套函数,这是一个好兆头,您应该使用普通函数而不是lambda表达式。

或者使用@ zero323的模板,如果您使用的是Python 2.x,则可以使用map而不是for但这是一个python问题,而不是pyspark一个,效果是相同的。

to_replace = ['finish', 'finished', 'terminate', 'done'] 

rdd = sc.parallelize([['r','w'],['n','finished']])
rdd.map(
    lambda xs: map(lambda x: "" if x.strip().lower() in to_replace else x, xs)
)

但是,如果to_replace列表确实很大,则应使用广播变量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM