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

时间:2019-01-18 16:00:19

标签: scala apache-spark

在以下代码中,我希望编译器能够识别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)

但是,它给了我一个错误,说error: not found: value output。如果我在python中执行相同的完全实现,则可以正常工作,并且可以获得预期的输出。为了使用Scala在火花中实现此功能,我已将output定义为可变变量,并在if-else内部对其进行了更新。

var output = spark.emptyDataFrame

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

println(output.show)

为什么第一个实现不起作用,并且有一种方法可以在不使用可变变量的情况下获得预期结果?

1 个答案:

答案 0 :(得分:5)

我怀疑您来自允许这种行为的 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