【发布时间】: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