如何让if语句返回dataframe而不是scala spark中的任何一个?

txu3uszq  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(434)

我尝试使用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 ?

rwqw0loc

rwqw0loc1#

我认为这主要是因为编译器不知道if语句的参数是否正确 true 或者 false . 因为它不知道,所以它只会默认推断返回类型为 Any . (我认为实际情况是,返回类型将是if-else表达式所有分支中“最小”的公共超类型,因为如果没有final-else,则默认值只是 Unit ; e、 g.试试看 println(if (false) "Hello!") 因此,在这种情况下,最小的公共超类型实际上是 Any )
如果要强制值始终具有 Dataset 你可以用这样的方法:

val x: DataFrame = if (true) {
        val y  = 1
        val x1 = df1.withColumn("id2", $"id" + y)
        x1
      } else spark.emptyDataFrame

附言:
为了说明编译器推断最小公共超类型的要点,这里有一个具体的例子:

val myBool: Boolean = ???

val x: TraversableOnce[Int] = if(myBool) Iterator.single(1) else List(1)

编译器将推断 x 有一种 TraversableOnce[Int] 因为这是最小的普通超型 List[Int] 以及 Iterator[Int]

相关问题