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是不可变的时,我们的意思是那些对象(不是指向它们的变量)不能被改变(对象在内存中的结构不能被修改),即使指向它们的非最终变量可以被重新分配,就像字符串对象一样。 这是关于编程基础知识的,我建议您在这篇文章中进行一些类比:变量、对象和引用之间的区别是什么?
1条答案
按热度按时间x8diyxa71#
你的困惑和spark的RDD没什么关系。这将有助于理解变量和对象之间的区别。一个更熟悉的例子:
假设您有一个字符串,我们都知道它是一个不可变的类型:
就像spark的RDD一样,
String
是不变的。但是你认为上面的第1、2和3行是怎么做的呢?你说3号线变了吗text
? 这就是你的困惑所在:text
是一个变量。申报时(第1行),text
是指向字符串对象的变量(""
)在记忆里。那个""
字符串对象不被第3行修改,但第3行创建了一个新的String
对象("ab"
),但重复使用相同的变量text
指向它。为了加强这一点,请注意text
以及text1
两个不同的变量指向同一个对象(相同的""
由第1行创建)如果您看到一个变量和它所指向的对象是两个不同的东西,那么很容易将其应用到rdd示例中(实际上与上面的字符串示例非常相似):
因此,第一行在内存中创建一个rdd对象,然后声明一个变量
a
,然后使a
指向rdd对象。第二行计算一个新的rdd对象(离开第一行),但是重用相同的变量。这意味着
a.map(_ + " is a number")
从第一个rdd对象创建一个新的rdd对象(第一个rdd对象不再分配给变量,因为您重用了同一个变量来指向派生的rdd)。简而言之,那么:当我们说spark的rdd是不可变的时,我们的意思是那些对象(不是指向它们的变量)不能被改变(对象在内存中的结构不能被修改),即使指向它们的非最终变量可以被重新分配,就像字符串对象一样。
这是关于编程基础知识的,我建议您在这篇文章中进行一些类比:变量、对象和引用之间的区别是什么?