java.lang.Long 和 scala.Long

2024-01-08

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

日志在这里。

[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(_ + _)

当我运行这段代码时斯卡拉 2.11.12、火花 2.3.2它可以正常工作,没有任何错误。
和相同的代码斯卡拉 2.12.7,火花 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 etc.

我尝试过的:

  1. 显式声明类型:
    private val (start: Long, end: Long) = ...
  2. 类似的事情在reduce code.

我知道的: 之间完美兼容scala.Long and java.lang.Long


与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] = {

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java.lang.Long 和 scala.Long 的相关文章

随机推荐