我是Spark的新手并且对RDD有疑问。让我们说我按如下方式定义RDD:
val data1 = sc.textFile()
然后让我说我做以下
1) val data2 = data1.map{...}
2) val data3 = data1
我很想知道1和2中场景背后会发生什么。data1
,data2
和data3
内存完全不同吗?也就是说,他们每个人都占用了一些内存还是有一定程度的数据共享?例如,data1
和data3
只有一段内存?
答案 0 :(得分:1)
RDD
仅仅是要完成的工作的代表,称为血统。并且,这是"不可变的" *,这引导我进入第一个场景。 data1
是加载文件的指令。当您使用它的map
方法时,该方法将该指令与新指令组合在一起,以便它返回一个新的指令集load file then transform it
。所以,它是一个包含第一个的新指令集。在第二种情况下,最终会有两个指向相同指令的内存位置。
所以,实际上,所有这些场景都具有相同的指令集。您可以在以下代码中看到:
val init = sc.parallelize(1 to 10).map(x=>{println(x);x})
val mapped = init.map(_+1)
val initCopy = init
initCopy.cache
initCopy.collect //Notice that the println occurs...this also caches the end result
mapped.collect //Notice that the println does NOT occur since it was using the same instruction that was cached
*我在引号中这样说是因为它可以修改,就像你调用cache
时一样,但是谱系是不可变的。