火花RDD不变性混淆 [英] Spark RDD immutability Confusion
本文介绍了火花RDD不变性混淆的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我目前正在为数据工程师的工作面试做准备。我陷入了困惑之中。 以下是详细信息。
如果Spark RDDS本质上是不可变的,那么为什么我们能够使用var创建Spark RDD?
推荐答案
您的困惑与Spark的RDDS没有什么关系。这将有助于理解变量和对象之间的区别。一个更熟悉的例子:
假设您有一个字符串,我们都知道它是一个不可变类型:
var text = "abc" //1
var text1 = text //2
text = text.substring(0,2) //3
和Spark的RDDS一样,String
是不变的。但是您认为上面的第1、2和3行是做什么的呢?您认为第3行更改了text
吗?这就是您的困惑所在:text
是一个变量。当声明(第1行)时,text
是指向内存中的字符串对象("abc"
)的变量。第3行没有修改"abc"
字符串对象,但第3行创建了一个新的String
对象("ab"
),但重用了相同的变量text
来指向它。为了强调这一点,请注意text
和text1
是指向同一对象的两个不同变量(与第1行创建的"abc"
相同)
如果您看到变量和它可能指向的对象是两个不同的东西,那么很容易将其应用于您的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)。
简而言之:当我们说Spark的RDDS是不可变的,我们的意思是那些对象(而不是指向它们的变量)不能变异(对象在内存中的结构不能被修改),即使指向它们的非最终变量可以被重新赋值,就像字符串对象的情况一样。
这是关于编程基础知识的,我建议您在这篇文章中进行一些类比:What is the difference between a variable, object, and reference?
这篇关于火花RDD不变性混淆的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文