与编码器 + 按名称一起使用时,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.15
和 Spark 3.1.2
(但它在旧的 Spark 版本上也失败)。
有趣的是:
- 如果我将
add(a)(b)
更改为 add(a, b)
,它会编译
- 如果我将
bar(f: => Int)
更改为 bar(f: Int)
,它会编译
- 如果我将
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转换有冲突
这是我无法编译的代码的简化版本:
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.15
和 Spark 3.1.2
(但它在旧的 Spark 版本上也失败)。
有趣的是:
- 如果我将
add(a)(b)
更改为add(a, b)
,它会编译 - 如果我将
bar(f: => Int)
更改为bar(f: Int)
,它会编译 - 如果我将
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转换有冲突