【问题标题】:pyspark - flatten nested rdd using lambda expression with map()pyspark - 使用带有 map() 的 lambda 表达式展平嵌套的 rdd
【发布时间】:2017-01-26 20:29:54
【问题描述】:

为了展平嵌套列表,我总是成功地使用列表推导式或 itertools.chain.from_iterable。

但是,使用 pyspark,我需要通过映射 lambda 函数来展平(元组)列表列表,并且由于某种原因,我无法“转换”这个成功的列表理解:

z = [[(1,2),(2,3),(3,4)],[(5,6),(7,8),(9,10)]]

[(j,k) for sublist in z for j,k in sublist]
[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)] # right answer

到等价的 map/lambda 等价物:

list(map(lambda z: [(j,k) for sublist in z for j,k in sublist],z))
TypeError: 'int' object is not iterable

这快把我逼疯了!我做错了什么?

【问题讨论】:

  • map 无法做到这一点。你需要fold/reduce。
  • @JaredSmith 你可以用地图以完全卑鄙的方式做到这一点......
  • @juanpa.arrivillaga 鉴于 OP 知道itertools.chain.from_iterable,我想知道我们是否还没有结束...
  • 完全揭示:我必须使用 map/lambda,因为我实际上是在尝试使用 pyspark 展平 RDD,并且希望避免将整个 RDD 转换为列表然后展平(使用,例如例如,itertools、reduce 等),因为它非常大。
  • @pniessen 所以这听起来像是 XY 问题。也许您可以在问题中详细说明上述内容...

标签: python list lambda list-comprehension


【解决方案1】:

我会建议你使用itertools.chain:

from itertools import chain

list(chain.from_iterable(z))

或者,您也可以将sum() 用作:

sum(z, [])

但是,如果必须使用 lambda 表达式,那么它可以与reduce 一起使用:

list(reduce(lambda x, y: x+y, z))

上述每个表达式返回的值将是:

[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)]

【讨论】:

  • 当然......它会带你O(N^2)时间;-)
  • @mgilson OP 已经确定他/她知道替代方案,但出于“某些原因”必须使用 HOF。
  • @mgilson 你是对的。对此没有任何争论。这可能是实现这一目标的最糟糕的方法。但我认为这就是 OP 想要的 :)
  • 背景故事 - 我必须使用 map/lambda 因为我实际上是在尝试扁平化 rdd = [[(1,2),(2,3),(3 ,4)],[(5,6),(7,8),(9,10)]] 使用 pyspark,并希望避免将整个 RDD 转换为列表然后展平(例如,使用 itertools,减少、求和等),因为它非常大。
  • @pniessen 您对地图的理解不正确。您应该使用生成器表达式。 Infact 链是一个迭代器表达式,如map(也如reduce)
【解决方案2】:

丑陋,但正式满足lambda和map的要求:

>>> res = []
>>> list(map(lambda z: res.extend(z), z))
>>> res
[(1, 2), (2, 3), (3, 4), (5, 6), (7, 8), (9, 10)]

【讨论】:

  • 愿 LAMBDA 之神诅咒你!
  • @juanpa.arrivillaga 是的,这很可能无法正常工作。
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 2017-05-08
  • 2018-11-09
  • 2016-07-13
  • 2011-09-19
  • 2016-06-24
  • 2018-05-14
相关资源
最近更新 更多