Scala методы без аргументов, оценивающих определение в zeppelin - PullRequest
0 голосов
/ 31 марта 2020

Я пишу метод в zeppelin, который обновит несколько DataFrames, который будет вызываться как часть инициализации моего кода.

Шаблон, который мы используем, состоит в том, чтобы определить все методы инициализации в их собственных абзацах, а затем вызвать их как часть блока.

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

Однако для большинства сигнатур определения методов без параметров кажется, что zeppelin фактически вызывает и оценивает последний метод в абзаце. Это проблема, потому что когда метод вызывается позже, это означает, что преобразования были применены к DataFrame дважды, что нежелательно.

Является ли это функцией scala, или причудой дирижабля, или обоих? Почему некоторые из этих объявлений оцениваются немедленно, в то время как другие ожидают вызова?

Предположим, что каждый из перечисленных ниже методов определен в их собственном абзаце 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 Я пропускаю?

Ответы [ 2 ]

0 голосов
/ 31 марта 2020

Вы правы, ни один из этих методов не должен оцениваться автоматически. По крайней мере, не в чистом виде Scala.

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

Вы должны обвинить Цеппелин в этом. Какую версию Zeppelin вы используете? Я не вижу этой проблемы в Zeppelin 0.9.0 - может быть, вам подойдет обновление?

0 голосов
/ 31 марта 2020

Поскольку в scala, def без пустого списка параметров является строгим значением; В конце концов, это на самом деле просто val.

Scala - это строгий язык, и если не сделать функцию фантомной, не добавив пустой список параметров, она будет вычислена немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...