java.lang.Long和scala.Long

时间:2018-11-22 06:46:37

标签: java scala apache-spark

我不知道代码中发生了什么...

日志在这里。

[error] blahblah\SampleApp.scala:22:53: overloaded method value reduce with alternatives:
[error]   (func: org.apache.spark.api.java.function.ReduceFunction[java.lang.Long])java.lang.Long <and>
[error]   (func: (java.lang.Long, java.lang.Long) => java.lang.Long)java.lang.Long
[error]  cannot be applied to ((java.lang.Long, java.lang.Long) => scala.Long)
[error]     val sumHundred = sparkSession.range(start, end).reduce(_ + _)

当我在 scala 2.11.12,spark 2.3.2 中运行此代码时,它可以正常工作而没有任何错误。
而且 scala 2.12.7,spark 2.4.0 中的相同代码不起作用-什么?

有人知道吗?

  private val (start, end) = (1, 101)

  def main(args: Array[String]): Unit = {
    val sumHundred = sparkSession.range(start, end).reduce(_ + _)
    logger.debug(f"Sum 1 to 100 = $sumHundred")
    close()
  }

有一个父级trait正在构建sparkSession等。

我尝试过的事情:

  1. 类型的显式声明:
    private val (start: Long, end: Long) = ...
  2. reduce代码中的类似内容。

我所知道的: 在scala.Longjava.lang.Long之间完全兼容

1 个答案:

答案 0 :(得分:1)

它与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 conversion precedes implicits

PS。我想说的主要娱乐来源是此SparkSession.range()方法,该方法采用Scala Long参数并返回Java Long值。

  def range(start: Long, end: Long): Dataset[java.lang.Long] = {

我会说选择其中之一会更加一致。