在Scala中进行Spark编程时是否使用了var?

时间:2016-05-04 04:24:37

标签: scala apache-spark

看起来总是使用 val ,我还没有在Spark中看到 var 程式。所以只是好奇这背后的原因是什么。我的理解是RDD是不可变的,我们不希望对现有的RDD进行更改或更新。谢谢!

3 个答案:

答案 0 :(得分:1)

您可以在程序中使用var,但不建议使用功能样式。

Scala支持functionalimperative范例,但它鼓励用户尽可能使用功能方法。功能风格的一个主要优点是告诉计算机 但是在某些情况下,命令式风格会更合适。

在功能方法中,提升了不可变对象的使用,您无需担心变量的状态,特别是在并发编程中,以使代码更安全,更清晰。但是有些情况下使用可变对象(var)更合适,就像创建对象非常昂贵而不仅仅是改变对象的一些属性一样。

因此valvar的使用取决于手头的任务。并不是说总是比另一种更好,它纯粹基于问题。

valvar不限于特定的工具/框架,它是Scala中的一般概念。所以当你说:

  

看起来总是使用val,我没有看到Spark中使用的var   程序

这是因为Spark通常使用并鼓励程序员使用功能方法。

答案 1 :(得分:1)

我在Spark编程中使用var的一种常见方法是在创建需要在执行程序上单独初始化的对象时。在这种情况下,我将在varnull的对象中定义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(稍后将计算)保存在单个变量中,然后更新它。”

例如,作者稍后会根据购买情况向某些客户提供折扣。

我不知道这是否被认为是好的或坏的做法,如果这只是为了教学目的。