如何在Spark中加载RDD

时间:2015-07-31 18:25:17

标签: apache-spark

我是Spark的新手并且对RDD有疑问。让我们说我按如下方式定义RDD:

val data1 = sc.textFile()

然后让我说我做以下

1) val data2 = data1.map{...}
2) val data3 = data1

我很想知道1和2中场景背后会发生什么。data1data2data3内存完全不同吗?也就是说,他们每个人都占用了一些内存还是有一定程度的数据共享?例如,data1data3只有一段内存?

1 个答案:

答案 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时一样,但是谱系是不可变的。