![](/img/trans.png)
[英]Scala java.lang.UnsupportedOperationException: Schema for type A is not supported
[英]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.