簡體   English   中英

java.lang.Long和scala.Long

[英]java.lang.Long and scala.Long

我不知道我的代碼中發生了什么...

日志在這里。

[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之間完全兼容

它與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轉換先於隱式

PS。 我想說的主要娛樂來源是此SparkSession.range()方法,該方法采用Scala Long參數並返回Java Long值。

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

我會說選擇其中之一會更加一致。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM