значение, определенное в «структуре if-else», не найдено вне «структуры if-else» - PullRequest
0 голосов
/ 18 января 2019

В следующем коде я ожидал, что компилятор определит, что output определяется либо в разделе if, либо в разделе else.

val df1 = spark.createDataFrame(Seq(
  (1, 10),
  (2, 20)
)).toDF("A", "B")

val df2 = spark.emptyDataFrame

if(df2.isEmpty){
    val output = df1
}
else{
    val output = df2
}

println(output.show)

Однако, это выдает ошибку «1007». если я делаю ту же самую точную реализацию в Python, она работает нормально, и я получаю ожидаемый результат. Чтобы заставить эту работу работать в spark с использованием scala, я определил output как переменную с переменными параметрами и обновил ее внутри if-else.

var output = spark.emptyDataFrame

if(df2.isEmpty){
    output = df1
}
else{
    output = df2
}

println(output.show)

Почему первая реализация не работает и есть ли способ получить ожидаемый результат без использования изменяемой переменной?

1 Ответ

0 голосов
/ 18 января 2019

Я подозреваю, что вы пришли из Python фона , где такое поведение разрешено.
В Scala этого достичь невозможно как есть, потому что структура if / else создает новый блок, а то, что определено в блоке, находится только в таком блоке.
Вы можете исправить это с помощью изменяемой переменной ...

var output: DataFrame = _
if(df2.isEmpty){
  output = df1
}
else{
  output = df2
}

Однако это очень Java и идет вразрез с неизменным принципом.
В Scala блок является выражением, и поэтому они могут возвращать значения.
Таким образом, это более идиоматический способ решения проблемы в Scala .

val output = if(df2.isEmpty) df1 else df2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...