【问题标题】:Scala methods with no argument evaluating on definition in zeppelin没有参数评估 zeppelin 中定义的 Scala 方法
【发布时间】:2020-07-11 10:50:04
【问题描述】:

我正在 zeppelin 中编写一个方法,该方法将更新几个 DataFrame,作为初始化我的代码的一部分被调用。

我们遵循的模式是在它们自己的段落中定义所有初始化方法,然后将它们作为块的一部分调用。

def init(nc: NotebookContext) = {
    method1()
    method2()
}

但是,对于大多数不带参数的方法的定义签名,zeppelin 似乎实际上是在调用和评估段落中的最后一个方法。这是一个问题,因为当稍后调用该方法时,这意味着转换已应用于 DataFrame 两次,这是不希望的。

这是 scala 的函数,还是 zeppelin 的怪癖,或两者兼而有之?为什么其中一些声明会立即评估,而另一些则等待调用?

假设以下方法均在各自的 zeppelin 段落中定义

def runsAutomatically(): Unit = { println("test") }
//runsAutomatically: ()Unit
//test
def runsAutomatically2 = { println("test2") }
//runsAutomatically2: Unit
//test2
def waitsForDefinition= () => { println("test") }
//waitsForDefinition: () => Unit

我知道没有参数列表的函数/方法和没有参数的单个参数列表之间的 scala 存在差异,但我不知道为什么这些不同的版本会在执行时发生变化。

最后,如果在一个段落中完成:

def runsAutomatically(): Unit = { println("test") }
def runsAutomatically2 = { println("test") }
//runsAutomatically: ()Unit
//runsAutomatically2: Unit
//test2

这只是齐柏林飞艇的怪癖,还是我缺少的关于 Scala 的东西?

【问题讨论】:

  • 真的认为这与 Zeppelin 有关,因为即使像 var x = 5 lazy val waitMore = { println("test5" + x)} 这样明确定义为惰性的东西也会立即评估它是否是一段中的最后一件事,但是在定义之后添加一个 println ,然后在调用 waitMore 之前在第二段中重新定义 x 具有预期的行为。

标签: scala apache-spark methods apache-zeppelin evaluation


【解决方案1】:

因为在scala中,一个没有空参数列表的def是一个严格的值;最后它实际上只是一个val。

Scala 是一门严格的语言,不通过不添加空参数列表来使函数成为 thunk 实际上会立即进行评估。

【讨论】:

  • 更多地了解与此问题相关的按名称呼叫是很有趣的,但我不知道这实际上是这种情况。在"on method invocations" 中,Sinisa Louc 说 def f = "foo" 基本上是一个“每次访问时都会执行评估”的值。这里的关键是我没有尝试在声明时访问该值,但如果它是段落中的最后一项,则 zeppelin 似乎会访问它以返回一个值。
【解决方案2】:

你是对的,这些方法都不应该被自动评估。至少,不是在纯 Scala 中。

def runsAutomatically(): Unit = { println("test") }
def runsAutomatically2 = { println("test2") }
def waitsForDefinition= () => { println("test") }

那你应该责怪齐柏林飞艇。您使用的是什么版本的 Zeppelin?我在 Zeppelin 0.9.0 中没有看到这个问题 - 也许升级是您的选择?

【讨论】:

  • 我使用的是 0.8.0,我认为我同意这是关于 Zeppelin 而不是特别是 Scala。我认为 Zeppelin 希望每个段落都有一个“结果”,因此它正在评估段落中的最后一个值。
猜你喜欢
  • 2015-08-22
  • 1970-01-01
  • 2019-06-02
  • 2011-10-19
  • 1970-01-01
  • 2019-05-13
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多