看起来总是使用 val ,我还没有在Spark中看到 var 程式。所以只是好奇这背后的原因是什么。我的理解是RDD是不可变的,我们不希望对现有的RDD进行更改或更新。谢谢!
答案 0 :(得分:1)
您可以在程序中使用var
,但不建议使用功能样式。
Scala支持functional和imperative范例,但它鼓励用户尽可能使用功能方法。功能风格的一个主要优点是告诉计算机 但是在某些情况下,命令式风格会更合适。
在功能方法中,提升了不可变对象的使用,您无需担心变量的状态,特别是在并发编程中,以使代码更安全,更清晰。但是有些情况下使用可变对象(var
)更合适,就像创建对象非常昂贵而不仅仅是改变对象的一些属性一样。
因此val
或var
的使用取决于手头的任务。并不是说总是比另一种更好,它纯粹基于问题。
val
和var
不限于特定的工具/框架,它是Scala中的一般概念。所以当你说:
看起来总是使用
val
,我没有看到Spark中使用的var
程序
这是因为Spark通常使用并鼓励程序员使用功能方法。
答案 1 :(得分:1)
我在Spark编程中使用var
的一种常见方法是在创建需要在执行程序上单独初始化的对象时。在这种情况下,我将在var
或null
的对象中定义None
,直到有些初始化它为止。 var
被隐藏,只是维持内部状态。
例如,我将创建一个这样的对象:
object DoesntSerialize {
var avroParser: Option[Schema.Parser] = None
def useParser(schemas: Array[String], record: GenericData.Record) : Array[Byte] = {
if (avroParser.isEmpty) {
initParser(schemas)
}
encodeRecord(record)
}
def encodeRecord(record: GenericData.Record) : Array[Byte] = {
...
}
def initParser(schemas: Array[String]) : Unit = {
...
}
}
然后在我的代码中,我可以使用该对象,并且第一次在每个执行程序initParser
上使用该对象时被调用。
答案 2 :(得分:0)
以下是我在Spark In Action部分4.1.2
中找到的带有RDD的示例中使用var
的案例。
var transByCust = ...// create pair RDD, key = customer ID, value = purchase info
使用var
的解释是“......变量,以便您可以将包含新事务和已更改事务的RDD(稍后将计算)保存在单个变量中,然后更新它。”
例如,作者稍后会根据购买情况向某些客户提供折扣。
我不知道这是否被认为是好的或坏的做法,如果这只是为了教学目的。