在以下代码中,我希望编译器能够识别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)
为什么第一个实现不起作用,并且有一种方法可以在不使用可变变量的情况下获得预期结果?
答案 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