我有一个非常基本的问题。 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/