我有一个非常基本的问题。 Spark的flatMap函数允许您为每个输入发出0,1或更多输出。因此,您提供给flatMap的(lambda)函数应返回一个列表。

我的问题是:如果该列表太大而导致您的内存无法处理!会发生什么?

我目前尚未实现此功能,应该在重写MapReduce软件之前解决该问题,该软件可以通过将context.write()放在我想要的算法中的任意位置来轻松解决此问题。 (单个映射器的输出很容易会达到数十亿字节。

如果您感兴趣:映射器会进行某种字数统计,但实际上会生成所有可能的子字符串,以及与文本匹配的各种正则表达式。 (生物信息学用例)

最佳答案



不,它不必返回列表。实际上,您可以轻松地使用惰性序列。当查看Scala RDD.flatMap签名时,可能更容易发现:

flatMap[U](f: (T) ⇒ TraversableOnce[U])

由于TraversableOnce的子类包括 SeqView Stream ,因此您可以使用惰性序列代替List。例如:
val rdd = sc.parallelize("foo" :: "bar" :: Nil)
rdd.flatMap {x => (1 to 1000000000).view.map {
    _ => (x, scala.util.Random.nextLong)
}}

由于您已经提到过lambda函数,因此我假设您正在使用PySpark。您可以做的最简单的事情是返回generator而不是list:
import numpy as np

rdd = sc.parallelize(["foo", "bar"])
rdd.flatMap(lambda x: ((x, np.random.randint(1000)) for _ in xrange(100000000)))

由于RDDs的计算是延迟的,因此甚至有可能从flatMap返回无限序列。使用 toolz 的一点力量:
from toolz.itertoolz import iterate
def inc(x):
    return x + 1

rdd.flatMap(lambda x: ((i, x) for i in iterate(inc, 0))).take(1)

关于mapreduce - Spark FlatMap函数可显示大量列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31220322/

10-12 13:54