簡體   English   中英

Scala:java.lang.UnsupportedOperationException:不支持原始類型

[英]Scala: java.lang.UnsupportedOperationException: Primitive types are not supported

我添加了以下代碼:

var counters: Map[String, Int] = Map()
val results = rdd.filter(l => l.contains("xyz")).map(l => mapEvent(l)).filter(r => r.isDefined).map (
          i => {
            val date = i.get.getDateTime.toString.substring(0, 10)
            counters = counters.updated(date, counters.getOrElse(date, 0) + 1)
          }
        )

我想在一次迭代中獲得 RDD 中不同日期的計數。 但是當我運行它時,我收到消息說:

No implicits found for parameters evidence$6: Encoder[Unit]

所以我添加了這一行:

  implicit val myEncoder: Encoder[Unit] = org.apache.spark.sql.Encoders.kryo[Unit]

但后來我得到了這個錯誤。

Exception in thread "main" java.lang.ExceptionInInitializerError
    at com.xyz.SparkBatchJob.main(SparkBatchJob.scala)
Caused by: java.lang.UnsupportedOperationException: Primitive types are not supported.
    at org.apache.spark.sql.Encoders$.genericSerializer(Encoders.scala:200)
    at org.apache.spark.sql.Encoders$.kryo(Encoders.scala:152)

我該如何解決? 或者有沒有更好的方法在一次迭代(O(N)時間)中獲得我想要的計數?

Spark RDD 是分布式集合的表示。 When you apply a map function to an RDD, the function that you use to manipulate the collection is going to be executed across the cluster so there is no sense in mutating a variable created out of the scope of the map function.

在您的代碼中,問題是因為您沒有返回任何值,而是試圖改變結構,因此編譯器推斷轉換后新創建的 RDD 是 RDD[Unit]。

如果您需要通過 Spark 操作創建 Map,則必須創建 pairRDD,然后應用 reduce 操作。

包括 rdd 的類型和 mapEvent function 以查看如何完成。

Spark 使用轉換和操作構建 DAG,它不會對數據進行兩次處理。

暫無
暫無

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

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