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

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

我尝试使用if else语句作为表达式,但得到的是 Any 而不是想要的 DataFrame .
这是一个可复制的

  1. val df1 = spark.createDataFrame(Seq(
  2. (0, "a"),
  3. (1, "b"),
  4. (2, "c"),
  5. (3, "a"),
  6. (4, "a"),
  7. (5, "c")
  8. )).toDF("id", "category")
  9. val x = if (true){
  10. val y = 1
  11. val x1 = df1.withColumn("id2", $"id"+y)
  12. x1
  13. }
  14. //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 你可以用这样的方法:

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

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

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

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

展开查看全部

相关问题