spark rdd不变性混淆

xnifntxz  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(329)

我目前正在准备我作为数据工程师的工作面试。我被困惑困住了。下面是细节。
如果sparkrdds本质上是不变的,那么为什么我们能够用var创建sparkrdds呢?

x8diyxa7

x8diyxa71#

你的困惑和spark的RDD没什么关系。这将有助于理解变量和对象之间的区别。一个更熟悉的例子:
假设您有一个字符串,我们都知道它是一个不可变的类型:

var text = "abc"                 //1
var text1 = text                 //2
text = text.substring(0,2)       //3

就像spark的RDD一样, String 是不变的。但是你认为上面的第1、2和3行是怎么做的呢?你说3号线变了吗 text ? 这就是你的困惑所在: text 是一个变量。申报时(第1行), text 是指向字符串对象的变量( "" )在记忆里。那个 "" 字符串对象不被第3行修改,但第3行创建了一个新的 String 对象( "ab" ),但重复使用相同的变量 text 指向它。为了加强这一点,请注意 text 以及 text1 两个不同的变量指向同一个对象(相同的 "" 由第1行创建)
如果您看到一个变量和它所指向的对象是两个不同的东西,那么很容易将其应用到rdd示例中(实际上与上面的字符串示例非常相似):

var a = sc.parallelize(Seq("1", "2", "3")) //like line 1 above
a = a.map(_ + " is a number")              //like line 3 above

因此,第一行在内存中创建一个rdd对象,然后声明一个变量 a ,然后使 a 指向rdd对象。第二行计算一个新的rdd对象(离开第一行),但是重用相同的变量。
这意味着 a.map(_ + " is a number") 从第一个rdd对象创建一个新的rdd对象(第一个rdd对象不再分配给变量,因为您重用了同一个变量来指向派生的rdd)。
简而言之,那么:当我们说spark的rdd是不可变的时,我们的意思是那些对象(不是指向它们的变量)不能被改变(对象在内存中的结构不能被修改),即使指向它们的非最终变量可以被重新分配,就像字符串对象一样。
这是关于编程基础知识的,我建议您在这篇文章中进行一些类比:变量、对象和引用之间的区别是什么?

相关问题