与Spark版本无关。
这是由于 2.11 之间的 Scala 实现存在差异。和2.12。
您可以看到代码实际的样子
val sumHundred = sparkSession.range(start, end).reduce(_ + _)
在 Scala 2.11 中(使用 scala.this.Predef.long2Long 转换)
val sumHundred: Long = sparkSession.range(start.toLong, end.toLong).reduce(((x$2: Long, x$3: Long) => scala.this.Predef.long2Long(scala.this.Predef.Long2long(x$2).+(scala.this.Predef.Long2long(x$3)))));
和 Scala 2.12(不应用隐式转换)
val <sumHundred: error>: <error> = sparkSession.range(start.toLong, end.toLong).<reduce: error>(((x$2: Long, x$3: Long) => x$2.$plus(x$3)));
如果添加标志,您的代码将编译scalacOptions += "-Xsource:2.11"
.
此页面有更多信息SAM 转换先于隐式转换 https://www.scala-lang.org/news/2.12.0/
附言。我想说这里有趣的主要来源是 SparkSession.range() 方法,它接受 Scala Long 参数并返回 Java Long 值。
def range(start: Long, end: Long): Dataset[java.lang.Long] = {
我想说选择其中之一会更加一致。