火花RDD不变性混淆 [英] Spark RDD immutability Confusion

查看:19
本文介绍了火花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来指向它。为了强调这一点,请注意texttext1是指向同一对象的两个不同变量(与第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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆