与编码器 + 按名称一起使用时,Spark Scala 代码无法编译

Spark Scala code does not compile when used with a encoder + by name

这是我无法编译的代码的简化版本:

object CompileFail {
  import org.apache.spark.sql.{ Encoder, SparkSession }

  case class Foo(x: Int)

  def run(spark: SparkSession): Int => Int = {
    import spark.implicits._
    add(bar(encode[Foo]))
  }

  def bar(f: => Int): Int = 0

  def encode[A : Encoder]: Int = 0

  def add(a: Int)(b: Int) = a + b
}

失败并显示以下无意义的消息:

[error] Error while emitting CompileFail.scala
[error] value $u
[error] one error found
[error] Compilation failed

我在 Scala 2.12.15Spark 3.1.2(但它在旧的 Spark 版本上也失败)。

有趣的是:

  1. 如果我将 add(a)(b) 更改为 add(a, b),它会编译
  2. 如果我将 bar(f: => Int) 更改为 bar(f: Int),它会编译
  3. 如果我将 add(bar(encode[Foo])) 更改为 add(bar(encode[String])),它会编译

我做错了什么?

我不认为你做错了什么,这是 scala 解析中的一个错误。只有做这个简单的改变才有效。

object CompileFail {
  import org.apache.spark.sql.{ Encoder, SparkSession }

  case class Foo(x: Int)

  def run(spark: SparkSession): Int => Int = {
    import spark.implicits._
    val i = encode[Foo]
    add(bar(i))
  }

  def bar(f: => Int): Int = 0

  def encode[A : Encoder]: Int = 0

  def add(a: Int)(b: Int) = a + b
}

貌似和函数的隐式解析和lambda转换有冲突