【问题标题】:Find all permutations of values in Spark RDD; python在 Spark RDD 中查找所有值的排列; Python
【发布时间】:2017-05-01 13:11:26
【问题描述】:

我有一个已映射为列表的 spark RDD (myData)。 myData.collect() 的输出产生以下结果:

['x', 'y', 'z']

我可以对 myData 执行什么操作来映射或创建一个包含 xyz 所有排列列表的新 RDD?例如 newData.collect() 会输出:

['xyz', 'xzy', 'zxy', 'zyx', 'yxz', 'yzx']

我尝试过使用笛卡尔(myData) 的变体,但据我所知,最好的结果是二值对的不同组合。

【问题讨论】:

标签: python list apache-spark pyspark permutation


【解决方案1】:

pyspark 中完成这一切。您可以使用rdd.cartesian,但您已经过滤掉重复并执行两次(不是说这很好!!!):

 >>> rdd1 = rdd.cartesian(rdd).filter(lambda x: x[1] not in x[0]).map(lambda x: ''.join(x))
 >>> rdd1.collect()
 ['xy', 'xz', 'yx', 'yz', 'zx', 'zy']
 >>> rdd2 = rdd1.cartesian(rdd).filter(lambda x: x[1] not in x[0]).map(lambda x: ''.join(x))
 >>> rdd2.collect()
 ['xyz', 'xzy', 'yxz', 'yzx', 'zxy', 'zyx']

【讨论】:

  • 这适用于给定的数据集,但我相信你知道它似乎不会很好地扩展。如果我说 10 个独特的字母,我正在寻找仍然适用的东西。不过感谢您的帮助!
【解决方案2】:
>>> from itertools import permutations
>>> t = ['x', 'y', 'z']
>>> ["".join(item) for item in permutations(t)]

['xyz', 'xzy', 'yxz', 'yzx', 'zxy', 'zyx']

注意:RDD object 可以使用转换为可迭代对象 toLocalIterator

【讨论】:

  • 你不需要那个list调用,你可以直接遍历permutations返回的iterable。
  • 嗯,这超出了 RDD 的范围,但是如果我在 RDD 管道中尝试它,我会收到错误“'TypeError: 'PipelinedRDD' object is not iterable”。示例尝试: test1 = originalRDD.map(lambda a: ["".join(item) for item in permutations(a)]) test1 = originalRDD.map(["".join(item) for item in permutations(originalRDD) ) 我想我可能需要先满足于收集..
  • @HSskillet 我不知道 Spark,但是如果您将传递给 permutations 的 RDD 对象转换为列表或元组,那应该可以工作。此外,您也许可以将 RDD.map 传递给生成器表达式而不是列表推导式。
  • @HSskillet,尝试使用 toLocalIterator() 将您的 RDD object 转换为 iterables
  • @JkShaw 迄今为止最好的解决方案,虽然我认为这和 collect() 之间没有太大区别,但使用迭代器似乎比制作一个全新的列表更有效。无论如何,我只是在之后再次并行化它。感谢您的帮助!
猜你喜欢
  • 2016-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
相关资源
最近更新 更多