ras*_*iya 1 scala apache-spark
在下面的代码中,我希望编译器识别output在if部分或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)
为什么第一个实现不起作用,是否有办法在不使用可变变量的情况下获得预期结果?
我怀疑你来自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)
| 归档时间: |
|
| 查看次数: |
43 次 |
| 最近记录: |