在"if-else结构"之外找不到"if-else结构"中定义的值

ras*_*iya 1 scala apache-spark

在下面的代码中,我希望编译器识别outputif部分或else部分中定义的get.

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)
Run Code Online (Sandbox Code Playgroud)

但是,它给我一个错误说 error: not found: value output.如果我在python中执行相同的实现,它工作正常,我得到预期的输出.为了使用scala使这个工作在spark中我已经定义output为一个可变变量并在其中更新它if-else.

var output = spark.emptyDataFrame

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

println(output.show)
Run Code Online (Sandbox Code Playgroud)

为什么第一个实现不起作用,是否有办法在不使用可变变量的情况下获得预期结果?

Lui*_*rez 5

我怀疑你来自Python 背景,允许这种行为.
Scala中,这是不可能实现的,因为if / else结构创建了一个新块,并且块中定义的内容仅驻留在这样的块中.
你可以通过使用一个可变变量来解决这个问题......

var output: DataFrame = _
if(df2.isEmpty){
  output = df1
}
else{
  output = df2
}
Run Code Online (Sandbox Code Playgroud)

但是,这是非常Java并且违背了不可变原则.
Scala中,块是表达式,因此它们可以返回值.
因此,这是解决Scala问题的更惯用的方法.

val output = if(df2.isEmpty) df1 else df2
Run Code Online (Sandbox Code Playgroud)