我尝试使用if else语句作为表达式,但得到的是 Any
而不是想要的 DataFrame
.
这是一个可复制的
val df1 = spark.createDataFrame(Seq(
(0, "a"),
(1, "b"),
(2, "c"),
(3, "a"),
(4, "a"),
(5, "c")
)).toDF("id", "category")
val x = if (true){
val y = 1
val x1 = df1.withColumn("id2", $"id"+y)
x1
}
//x: Any = [id: int, category: string ... 1 more field]
为什么是 x
类型 Any
而不是 DataFrame
?
1条答案
按热度按时间rwqw0loc1#
我认为这主要是因为编译器不知道if语句的参数是否正确
true
或者false
. 因为它不知道,所以它只会默认推断返回类型为Any
. (我认为实际情况是,返回类型将是if-else表达式所有分支中“最小”的公共超类型,因为如果没有final-else,则默认值只是Unit
; e、 g.试试看println(if (false) "Hello!")
因此,在这种情况下,最小的公共超类型实际上是Any
)如果要强制值始终具有
Dataset
你可以用这样的方法:附言:
为了说明编译器推断最小公共超类型的要点,这里有一个具体的例子:
编译器将推断
x
有一种TraversableOnce[Int]
因为这是最小的普通超型List[Int]
以及Iterator[Int]