【发布时间】:2018-11-15 23:12:03
【问题描述】:
我正在编写一个数据集非常灵活的 Spark 作业,它被定义为 Dataset[Map[String, java.io.Serializable]]。
现在问题开始出现,spark 运行时抱怨No Encoder found for java.io.Serializable。我试过 kyro serde,仍然显示相同的错误消息。
我必须使用这种奇怪的数据集类型的原因是因为我每行都有灵活的字段。地图看起来像:
Map(
"a" -> 1,
"b" -> "bbb",
"c" -> 0.1,
...
)
Spark 中是否有处理这种灵活数据集类型的方法?
编辑: 这是任何人都可以尝试的可靠代码。
import org.apache.spark.sql.{Dataset, SparkSession}
object SerdeTest extends App {
val sparkSession: SparkSession = SparkSession
.builder()
.master("local[2]")
.getOrCreate()
import sparkSession.implicits._
val ret: Dataset[Record] = sparkSession.sparkContext.parallelize(0 to 10)
.map(
t => {
val row = (0 to t).map(
i => i -> i.asInstanceOf[Integer]
).toMap
Record(map = row)
}
).toDS()
val repartitioned = ret.repartition(10)
repartitioned.collect.foreach(println)
}
case class Record (
map: Map[Int, java.io.Serializable]
)
上面的代码会给你错误编码器未找到:
Exception in thread "main" java.lang.UnsupportedOperationException: No Encoder found for java.io.Serializable
- map value class: "java.io.Serializable"
- field (class: "scala.collection.immutable.Map", name: "map")
【问题讨论】:
-
@thebluephantom 添加代码,可以直接在intelliJ中运行。
标签: apache-spark