Spark Dataset操作Set集合异常
问题
java.lang.UnsupportedOperationException: No Encoder found for scala.collection.immutable.Set[String]
说明
在使用Spark Dataset时发生,源码:
import ss.implicits._
val points = 1000000
val list = new ListBuffer[(Float,Float)]
for(i <- 1 to points){
list += ((Random.nextFloat(),Random.nextFloat()))
}
val rdd = ss.sparkContext.makeRDD(list,40)
val ds = rdd.toDS
//Dataset不支持Set集合类型
.map(v =>(v._1,v._2,mutable.Set(v._1,v._2)))
ds.show(false)
解决
由于dataset的隐式转换编码器只能用于序列,Seq、Array、case class等等,不支持Set、HashSet等集合类型
方案1. 改用Array类型
方案2. 如果非要用Set,可以先.rdd转换成RDD,即可支持Set集合类型
参考:https://stackoverflow.com/questions/45020230/apache-spark-2-1-java-lang-unsupportedoperationexception-no-encoder-found-for